You are on page 1of 36

Proyecto Agenda

Administracin de base de datos


Sexto cuatrimestre en ciencias computacionales proporciona el planteamiento y el prototipo de una agenda empresarial como el fin de implementar lo aprendido en el saln de clase.

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Planteamiento del Problema La manera actual en la cual nuestra empresa mantiene actualizado los datos de contacto de los proveedores, clientes y/o amigos, es poco eficiente y rudimentaria, ya que se guardan en agendas convencionales a las cuales solo tienen acceso personal especifico en lugares establecidos.

Se plantea la necesidad de encontrar de manera rpida y eficiente cualquier informacin de contacto especifico y que los datos de la agenda sean tiles y fidedignos para otros fines diferentes a una agenda comercial y estos datos sean accesibles desde cualquier sitio, a personal autorizado y debidamente acreditado. Propuesta de solucin del problema Se propone la implementacin de una agenda electrnica , la cual almacenara la informacin de los contactos en una base de datos, que sea accesible para consulta, as como para la implementacin en otras aplicaciones.

*Terminar de chorear Motores de Base de Datos.

 MS SQL SERVER  ORACLE  SYBASE  MYSQL  POSTGRESS  MS ACCESS  YBM DB2 Plataformas  BSD  FREEBSD  HP-UX

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.  GNU-LINUX  MAC OSX  SOLARIS  SUN OS  WINDOWS Aplicaciones  JAVA  PERL  PHP  C/C++  VISUALBASIC  VISUAL STUDIO  DELPHI

Opcion 1. MYSQL MySQL es un sistema de gestin de bases de datos relacional, multihilo y multiusuario con ms de seis millones de instalaciones.1 MySQL AB desde enero de 2008 una subsidiaria de Sun Microsystems y sta a su vez de Oracle Corporation desde abril de 2009 desarrolla MySQL como software libre en un esquema de licenciamiento dual. Por un lado se ofrece bajo la GNUGPL para cualquier uso compatible con esta licencia, pero para aquellas empresas que quieran incorporarlo en productos privativos deben comprar a la empresa una licencia especfica que les permita este uso. Est desarrollado en su mayor parte en ANSI C. Al contrario de proyectos como Apache, donde el software es desarrollado por una comunidad pblica y los derechos de autor del cdigo estn en poder del autor individual, MySQL es patrocinado por una empresa privada, que posee el copyright de la mayor parte del cdigo.

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Esto es lo que posibilita el esquema de licenciamiento anteriormente mencionado. Adems de la venta de licencias privativas, la compaa ofrece soporte y servicios. Para sus operaciones contratan trabajadores alrededor del mundo que colaboran va Internet.

Opcin 2. Access Microsoft Access es un programa, utilizado en los sistemas operativos Microsoft Windows, para la gestin de bases de datos creado y modificado por Microsoft y orientado a ser usado en entornos personal o en pequeas organizaciones. Es un componente de la suite Microsoft Office. Permite crear ficheros de bases de datos relacionales que pueden ser fcilmente gestionadas por una interfaz grfica sencilla. Adems, estas bases de datos pueden ser consultadas por otros programas. Dentro de un sistema de informacin, entrara dentro de la categora de gestin, y no en la de ofimtica, como podra pensarse. Este programa permite manipular los datos en forma de tablas (formadas por filas y columnas), crear relaciones entre tablas, consultas, formularios para introducir datos e informes para presentar la informacin Tabla Comparativa.

Motor de Base de Datos a utilizar


MYSQL

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.

Justificacin

-MySQL es gratuito -Es un gestor de BD, MySQL es cliente/servidor, o sea, tienes tu BD en un servidor potente y solo tienes aplicaciones clientes en las estaciones de trabajo. Esto te da la ventaja de que la nica maquina potente que necesitas es el servidor, adems de que puedes usar storedprocedures que al correr en el servidor se ejecutan mucho ms rpido. -Familiaridad con el motor de base de datos Mysql. -Es un motor multiplataforma. -Existe una gran cantidad de informacin disponible. -Escaso conocimiento del motor de base de datos postgreSQL. -Mayor velocidad de MYSQL sobre PostgreSQL. -MySQL es un motor de base de datos con mayor tiempo en el mercado en comparacin con PostgreSQL lo que genera ms confianza en el motor. -A pesar que MySQL tiene una integridad de datos menor a la de PostgreSQL para la envergadura del proyecto no tiene mayor influencia.

USO DEL CLIENTE MYSQL (Informacin utilizada para comprender, entender y aprender funciones del motor de la base de datos)
El cliente mysql, crear y usar una sencilla base de datos. mysql (algunas veces referido como "monitor mysql") es un programa interactivo que permite conectarnos a un servidor MySQL, ejecutar algunas consultas, y ver los resultados. mysql puede ser usado tambin en modo batch: es decir, se pueden colocar toda una serie de consultas en un archivo, y posteriormente decirle

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. a mysql que ejecute dichas consultas. Asumimos que mysql est instalado en alguna mquina y que disponemos de un servidor MySQL al cul podemos conectarnos. Si este no es el caso, tenemos que contactar con nuestro administrador MySQL. (Si nosotros somos los administradores, es necesario consultar la documentacin de MySQL que se refiere a la instalacin y configuracin del servidor MySQL). Para ver la lista de opciones proporcionadas por mysql , lo invocamos con la opcin --help: shell>mysql --help A continuacin se describe el proceso completo de creacin y uso de una base de datos en MySQL. Si se est interesado slo en el acceso y uso de una base de datos existente, se pueden omitir las secciones que describen como crear la base de datos y las tablas correspondientes. Puesto que es imposible que se describan a detalle muchos de los tpicos cubiertos en este Documento, se recomienda que se consulte el manual de MySQL para obtener ms informacin al respecto.

Conectndose y desconectndose al servidor MySQL


Para conectarse al servidor, usualmente necesitamos de un nombre de usuario (login) y de una contrasea (password), y si el servidor al que nos deseamos conectar est en una mquina diferente de la nuestra, tambin necesitamos indicar el nombre o la direccin IP de dicho servidor. Una vez que conocemos estos tres valores, podemos conectarnos de la siguiente manera: shell>mysql -h NombreDelServidor -u NombreDeUsuario -p Cuando ejecutamos este comando, se nos pedir que proporcionemos tambin la contrasea para el nombre de usuario que estamos usando. Si la conexin al servidor MySQL se pudo establecer de manera satisfactoria, recibiremos el mensaje de bienvenida y estaremos en el prompt de mysql : shell>mysql -h casita -u blueman -p Enter password: ****** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5563 to server version: 3.23.41 Type 'help;' or '\h' for help. Type '\c' toclearthe buffer. mysql> Este prompt nos indica que mysql est listo para recibir comandos. Algunas instalaciones permiten que los usuarios se conecten de manera annima al servidor corriendo en la mquina local. Si es el caso de nuestra mquina, debemos de ser capaces de conectarnos al servidor invocando a mysql sin ninguna opcin: shell>mysql

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Despus de que nos hemos conectado de manera satisfactoria, podemos desconectarnos en cualquier momento al escribir "quit", "exit", o presionar CONTROL+D. La mayora de los ejemplos siguientes asume que estamos conectados al servidor, lo cual se indica con el prompt de mysql .

EJECUTANDO ALGUNAS CONSULTAS


En este momento debimos de haber podido conectarnos ya al servidor MySQL, an cuando no hemos seleccionado alguna base de datos para trabajar. Lo que haremos a continuacin es escribir algunos comandos para irnos familiarizando con el funcionamiento de mysql mysql> SELECT VERSION(), CURRENT_DATE; +-----------+--------------+ | VERSION() | CURRENT_DATE | +-----------+--------------+ | 3.23.41 | 2002-10-01 | +-----------+--------------+ 1 row in set (0.03 sec) mysql> Este comando ilustra distintas cosas acerca de mysql :
y y

Un comando normalmente consiste de un sentencia SQL seguida por un punto y coma. Cuando emitimos un comando, mysql lo manda al servidor para que lo ejecute, nos muestra los resultados y regresa el prompt indicando que est listo para recibir ms consultas. mysql muestra los resultados de la consulta como una tabla (filas y columnas). La primera fila contiene etiquetas para las columnas. Las filas siguientes muestran los resultados de la consulta. Normalmente las etiquetas de las columnas son los nombres de los campos de las tablas que estamos usando en alguna consulta. Si lo que estamos recuperando es el valor de una expresin (como en el ejemplo anterior) las etiquetas en las columnas son la expresin en s. mysql muestra cuntas filas fueron regresadas y cuanto tiempo tard en ejecutarse la consulta, lo cual puede darnos una idea de la eficiencia del servidor, aunque estos valores pueden ser un tanto imprecisos ya que no se muestra la hora del CPU, y porque pueden verse afectados por otros factores, tales como la carga del servidor y la velocidad de comunicacin en una red. Las palabras clave pueden ser escritas usando maysculas y minsculas.

Las siguientes consultas son equivalentes: mysql> SELECT VERSION(), CURRENT_DATE; mysql> select version(), current_date; mysql>SeLeCtvErSiOn(), current_DATE; Aqu est otra consulta que demuestra como se pueden escribir algunas expresiones matemticas y trigonomtricas: mysql>SELECT SIN(PI()/4), (4+1)*5; +-------------+---------+ | SIN(PI()/4) | (4+1)*5 | +------------+---------+ | 0.707107 | 25 | +-------------+---------+

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Aunque hasta este momento se han escrito sentencias sencillas de una sla lnea, es posible escribir ms de una sentencia por lnea, siempre y cuando estn separadas por punto y coma: mysql> SELECT VERSION(); SELECT NOW(); +-----------+ | VERSION() | +-----------+ | 3.23.41 | +-----------+ 1 row in set (0.01 sec) +---------------------+ | NOW() | +---------------------+ | 2002-1028 14:26:04 | +---------------------+ 1 row in set (0.01 sec)

EL PROMPT DE MYSQL
Un comando no necesita ser escrito en una sla lnea, as que los comandos que requieran de varias lneas no son un problema. mysql determinar en dnde finaliza la sentencia cuando encuentre el punto y coma, no cuando encuentre el fin de lnea. Aqu est un ejemplo que muestra un consulta simple escrita en varias lneas: mysql> SELECT -> USER(), ->CURRENT_DATE; +-------------------+--------------+ | USER() | CURRENT_DATE | +-------------------+--------------+ | blueman@localhost | 2002-09-14 | +------------------+--------------+ 1 row in set (0.00 sec) mysql> En este ejemplo debe notarse como cambia el prompt (de mysql> a ->) cuando se escribe una consulta en varias lneas. Esta es la manera en cmo mysql indica que est esperando a que finalice la consulta. Sin embargo si deseamos no terminar de escribir la consulta, podemos hacerlo al escribir c como se muestra en el siguiente ejemplo: mysql> SELECT -> USER(), -> c mysql> De nuevo, se nos regresa el comando el promptmysql> que nos indica que mysql est listo para una nueva consulta. En la siguiente tabla se muestran cada uno de los prompts que podemos obtener y una breve descripcin de su significado para mysql :

Prompt mysql> -> '> ">

Significado Listo para una nueva consulta. Esperando la lnea siguiente de una consulta multi-lnea. Esperando la siguiente lnea para completar una cadena que comienza con una comilla sencilla ( ' ). Esperando la siguiente lnea para completar una cadena que comienza con una comilla doble ( " ).

Los comandos multi-lnea comnmente ocurren por accidente cuando tecleamos ENTER, pero olvidamos escribir el punto y coma. En este caso mysql se queda esperando para que finalicemos la consulta:

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. mysql>SELECTUSER() -> Si esto llega a suceder, muy probablemente mysql estar esperando por un punto y coma, de manera que si escribimos el punto y coma podremos completar la consulta ymysql podr ejecutarla: mysql> SELECT USER() -> ; +----------------+ | USER() | +----------------+ | root@localhost | +---------------+ 1 row in set (0.00 sec) mysql> Los prompts '> y "> ocurren durante la escritura de cadenas. En mysql podemos escribir cadenas utilizando comillas sencillas o comillas dobles (por ejemplo, 'hola' y "hola"), y mysql nos permite escribir cadenas que ocupen mltiples lneas. De manera que cuando veamos el prompt '> o "> , mysql nos indica que hemos empezado a escribir una cadena, pero no la hemos finalizado con la comilla correspondiente. Aunque esto puede suceder si estamos escribiendo una cadena muy grande, es ms frecuente que obtengamos alguno de estos prompts si inadvertidamente escribimos alguna de estas comillas. Por ejemplo: mysql>SELECT * FROMmi_tablaWHERE nombre = "Lupita AND edad < 30; "> Si escribimos esta consulta SELECT y entonces presionamos ENTER para ver el resultado, no suceder nada. En lugar de preocuparnos porque la consulta ha tomado mucho tiempo, debemos notar la pista que nos da mysql cambiando el prompt. Esto nos indica que mysql est esperando que finalicemos la cadena iniciada ("Lupita). En este caso, qu es lo que debemos hacer? . La cosa ms simple es cancelar la consulta. Sin embargo, no basta con escribir c, ya que mysql interpreta esto como parte de la cadena que estamos escribiendo. En lugar de esto, debemos escribir antes la comilla correspondiente y despus c : mysql> SELECT * FROM mi_tabla WHERE nombre = "Lupita AND edad< 30; "> " c mysql> El prompt cambiar de nuevo al ya conocido mysql>, indicndonos que mysql est listo para una nueva consulta. Es sumamente importante conocer lo que significan los prompts '> y ">, ya que si en algn momento nos aparece alguno de ellos, todas la lneas que escribamos a continuacin sern consideradas como parte de la cadena, inclusive cuando escribimos QUIT. Esto puede ser confuso, especialmente si no sabemos que es necesario escribir la comilla correspondiente para finalizar la cadena, para que podamos escribir despus algn otro comando, o terminar la.

CALCULOS CON FECHAS


MySQL proporciona diversas funciones que se pueden usar para efectuar clculos sobre fechas, por ejemplo, para calcular edades o extraer partes de una fecha (da, mes, ao, etc). Para determinar la edad de cada una de nuestras mascotas, tenemos que calcular la diferencia de aos de la fecha actual y la fecha de nacimiento, y entonces substraer uno si la fecha actual ocurre

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. antes en el calendario que la fecha de nacimiento. Las siguientes consultas muestran la fecha actual, la fecha de nacimiento y la edad para cada mascota. mysql>SELECT nombre, nacimiento, CURRENT_DATE, -> (YEAR(CURRENT_DATE) YEAR(nacimiento)) -> - (RIGHT(CURRENT_DATE,5) <RIGHT(nacimiento,5)) AS edad FROM mascotas; +--------+------------+--------------+------+ | nombre | nacimiento | CURRENT_DATE | edad | +--------+------------+--------------+------+ | Fluffy | 1999-02-04 | 2002-12-23 | 3 | | Mau | 199803-17 | 2002-12-23 | 4 | | Buffy | 1999-05-13 | 2002-12-23 | 3 | | FanFan | 2000-08-27 | 2002-12-23 | 2 | | Kaiser | 1989-08-31 | 2002-12-23 | 13 | | Chispa | 1998-09-11 | 2002-12-23 | 4 | | Wicho | 200002-09 | 2002-12-23 | 2 | | Skim | 2001-04-29 | 2002-12-23 | 1 | | Pelusa | 2000-03-30 | 2002-12-23 | 2 | +--------+------------+--------------+------+ 9 rows in set (0.01 sec) Aqu, YEAR( ) obtiene nicamente el ao y RIGHT( ) obtiene los cinco caracteres ms a la derecha de cada una de las fechas, que representan el mes y el da (MM-DD). La parte de la expresin que compara los valores MM-DD se evala a 1 o 0, y permite ajustar el valor de la edad en el caso de que el valor MM-DD de la fecha actual ocurra antes del valor MM-DD de la fecha de nacimiento. Dado que la expresin en s es bastante fea, se ha usado un alias (edad) que es el que aparece como etiqueta en la columna que muestra el resultado de la consulta. Esta consulta debe trabajar bien, pero el resultado puede ser de alguna manera ms til si las filas son presentadas en algn orden. Para ello haremos uso de la clusula ORDERBY. Por ejemplo, para ordenar por nombre, usaremos la siguiente consulta: mysql>SELECT nombre, nacimiento, CURRENT_DATE, -> (YEAR(CURRENT_DATE) YEAR(nacimiento)) -> - (RIGHT(CURRENT_DATE,5) <RIGHT(nacimiento,5)) -> AS edad FROM mascotas ORDERBY nombre; +--------+------------+--------------+------+ | nombre | nacimiento | CURRENT_DATE | edad | +--------+------------+--------------+------+ | Buffy | 1999-0513 | 2002-12-23 | 3 | | Chispa | 1998-09-11 | 2002-12-23 | 4 | | FanFan | 2000-08-27 | 2002-12-23 | 2 | | Fluffy | 1999-02-04 | 2002-12-23 | 3 | | Kaiser | 1989-08-31 | 2002-12-23 | 13 | | Mau | 1998-03-17 | 2002-12-23 | 4 | | Pelusa | 2000-03-30 | 2002-12-23 | 2 | | Skim | 2001-04-29 | 2002-12-23 | 1 | | Wicho | 2000-02-09 | 2002-12-23 | 2 | +--------+------------+--------------+------+ 9 rows in set (0.00 sec) Para ordenar por edad en lugar de nombre, nicamente tenemos que usar una clusula ORDERBY diferente: mysql>SELECT nombre, nacimiento, CURRENT_DATE, -> (YEAR(CURRENT_DATE) YEAR(nacimiento)) -> - (RIGHT(CURRENT_DATE,5) <RIGHT(nacimiento,5)) -> AS edad FROM mascotas ORDERBY edad; +--------+------------+--------------+------+ | nombre | nacimiento | CURRENT_DATE | edad | +--------+------------+--------------+------+ | Skim | 2001-04-29 | 2002-1223 | 1 | | FanFan | 2000-08-27 | 2002-12-23 | 2 | | Wicho | 2000-02-09 | 2002-12-23 | 2 | | Pelusa | 2000-03-30 | 2002-12-23 | 2 | | Fluffy | 1999-02-04 | 2002-12-23 | 3 | | Buffy | 1999-05-13 | 2002-1223 | 3 | | Mau | 1998-03-17 | 2002-12-23 | 4 | | Chispa | 1998-09-11 | 2002-12-23 | 4 | | Kaiser | 198908-31 | 2002-12-23 | 13 | +--------+------------+--------------+------+ 9 rows in set (0.01 sec) consulta que deseamos ejecutar.

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.

Coincidencia de patrones
MySQL posee capacidades estndar para utilizar patrones as como tambin una forma de patrones basada en expresiones regulares extendidas similares a las que se encuentran en utilidades de UNIX, como ser vi, grep, ysed. Los patrones SQL permiten emplear el caracter '_' para representar coincidencia con un carcter individual y '%' En MySQL, por defecto, los patrones SQL no son case-sensitive. Abajo se muestran algunos ejemplos. Advierta que no se emplean los operadores = o <> para trabajar con patrones SQL, en lugar de eso se usan los operadores de comparacin LIKE o NOTLIKE. Para encontrar nombres que comiencen con 'b':
mysql> SELECT * FROM pet WHERE name LIKE 'b%'; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+

Para encontrar nombres que terminen con 'fy':


mysql> SELECT * FROM pet WHERE name LIKE '%fy'; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +--------+--------+---------+------+------------+-------+

Para encontrar nombres que contengan 'w':


mysql> SELECT * FROM pet WHERE name LIKE '%w%'; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+

Para encontrar nombres que contengan exactamente 5 caracteres, use 5 veces el caracter patrn '_':
mysql> SELECT * FROM pet WHERE name LIKE '_____'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.
| Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+

Los otros patrones que pueden emplearse con MySQL usan expresiones regulares extendidas. Cuando busque coincidencias con este tipo de patrones, use los operadores REGEXP y NOTREGEXP (o bien los sinnimos RLIKE yNOTRLIKE). Algunas caractersticas de las expresiones regulares extendidas:
y y

'.' detecta coincidencia con cualquier carcter individual. Una clase de carcter '[...]' detecta coincidencia con cualquier caracter entre los corchetes. Por ejemplo, '[abc]' coincidir con 'a', 'b', o 'c'. Para hacer referencia a un rango de caracteres, use un guin. '[a-z]' detecta coincidencia con cualquier letra, mientras que '[0-9]' lo hace con cualquier dgito. '*' detecta coincidencia con cero o ms apariciones de los caracteres que lo preceden. Por ejemplo, 'x*' detecta cualquier nmero de caracteres 'x', '[0-9]*' detecta cualquier cantidad de dgitos, y '.*' coincidir con cualquier nmero de cualquier carcter. REGEXP tendr xito si el patrn suministrado encuentra coincidencia en cualquier parte del valor examinado (esto difiere de LIKE en que este ltimo solo tiene xito si el patrn concuerda con todo el valor). Para lograr que un patrn detecte coincidencias solamente al principio o al final del valor examinado, utilice '^' al principio o '$' al final del patrn. Para demostrar el funcionamiento de las expresiones regulares extendidas, las consultas con LIKE expuestas anteriormente se han reescrito utilizando REGEXP. Para hallar nombres que comiencen con 'b', use '^' para buscar coincidencia al principio del valor:
mysql> SELECT * FROM pet WHERE name REGEXP '^b'; +--------+--------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+------------+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +--------+--------+---------+------+------------+------------+

En MySQL 5.0, si realmente quiere forzar a que la comparacin realizada por REGEXP sea case sensitive, utilice la palabra clave BINARY para convertir a una de las cadenas en una cadena binaria. Esta consulta solamente encontrar coincidencia con 'b' minsculas al comienzo de un nombre:

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b'; Para hallar nombres finalizados en 'fy', emplee '$' para buscar la coincidencia en el final del nombre:
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$'; +--------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +--------+--------+---------+------+------------+-------+ | Fluffy | Harold | cat | Buffy | Harold | dog | f | f | 1993-02-04 | NULL | 1989-05-13 | NULL | |

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

Para encontrar nombres conteniendo una 'w', utilice esta consulta:


mysql> SELECT * FROM pet WHERE name REGEXP 'w'; +----------+-------+---------+------+------------+------------+ | name | owner | species | sex | birth | death | +----------+-------+---------+------+------------+------------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +----------+-------+---------+------+------------+------------+

Debido a que un patrn de expresin regular encuentra coincidencia sin importar el lugar del valor donde se produce, en la consulta previa no es necesario colocar un comodn a cada lado del patrn para obtener coincidencia en cualquier parte del valor, como hubiera sucedido de utilizar un patrn SQL Para hallar nombres conteniendo exactamente cinco caracteres, use '^' y '$' para obligar a que la coincidencia deba estar al principio y al final del nombre, y cinco instancias de '.' entre ellas.
mysql> SELECT * FROM pet WHERE name REGEXP '^.....$'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+

La consulta anterior tambin se podra haber escrito empleando el operador '{n}' repetir-n-veces:
mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$'; +-------+--------+---------+------+------------+-------+ | name | owner | species | sex | birth | death | +-------+--------+---------+------+------------+-------+ | Claws | Gwen | cat | m | 1994-03-17 | NULL |

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.
| Buffy | Harold | dog | f | 1989-05-13 | NULL | +-------+--------+---------+------+------------+-------+

Qu informacin hay?
Un primer paso antes de ver cmo borrar informacin es saber qu informacin tenemos almacenada. Podemos saber las bases de datos que hay creadas en nuestro sistema con: showdatabases; Una vez que estamos trabajando con una base de datos concreta (con la orden "use"), podemos saber las tablas que contiene con: showtables; Y para una tabla concreta, podemos saber los campos (columnas) que la forman con "show columnsfrom": showcolumnsfrom personas; Por ejemplo, esto dara como resultado: +-----------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra |

+-----------+--------------+------+-----+---------+-------+ | nombre | varchar(20) | YES | | direccion | varchar(40) | YES | | edad | decimal(3,0) | YES | | NULL | NULL | NULL | NULL | | | | | | | |

| codciudad | varchar(3) | YES |

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

Borrar toda la base de datos

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. En alguna ocasin, como ahora que estamos practicando, nos puede interesar borrar toda la base de datos. La orden para conseguirlo es: dropdatabase ejemplo2; Si esta orden es parte de una secuencia larga de rdenes, que hemos cargado con la orden "source" (por ejemplo) y la base de datos no existe, obtendramos un mensaje de error y se interrumpira el proceso. Podemos evitarlo aadiendo "ifexists", para que se borre la base de datos slo si realmente existe: dropdatabase ejemplo2 ifexists;

Borrar una tabla


Es ms frecuente que creemos alguna tabla de forma incorrecta. La solucin razonable es corregir ese error, cambiando la estructura de la tabla, pero todava no sabemos hacerlo. Al menos veremos cmo borrar una tabla. La orden es: droptable personas; Al igual que para las bases de datos, podemos hacer que la tabla se borre slo cuando realmente existe: drop table personas if exists;

Borrar datos de una tabla


Tambin podemos borrar los datos que cumplen una cierta condicin. La orden es "deletefrom", y con "where" indicamos las condiciones que se deben cumplir, de forma similar a como hacamos en la orden "select": delete from personas where nombre = 'juan'; Esto borrara todas las personas llamadas "juan" que estn almacenadas en la tabla "personas". Cuidado: si no se indica la parte de "where", no se borraran los datos que cumplen una condicin, sino TODOS los datos. Si es eso lo que se pretende, una forma ms rpida de conseguirlo es usar: truncatetable personas;

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.

Modificacin de datos

Ya sabemos borrar datos, pero existe una operacin ms frecuente que esa (aunque tambin ligeramente ms complicada): modificar los datos existentes. Con lo que sabamos hasta ahora, podamos hacer algo parecido: si un dato es incorrecto, podramos borrarlo y volver a introducirlo, pero esto, obviamente, no es lo ms razonable... debera existir alguna orden para cambiar los datos. As es. El formato habitual para modificar datos de una tabla es "update tabla set campo=nuevoValorwherecondicion". Por ejemplo, si hemos escrito "Alberto" en minsculas ("alberto"), lo podramos corregir con: update personas set nombre = 'Alberto' where nombre = 'alberto'; Y si queremos corregir todas las edades para sumarles un ao se hara con update personas set edad = edad+1; (al igual que habamos visto para "select" y para "delete", si no indicamos la parte del "where", los cambios se aplicarn a todos los registros de la tabla).

Modificar la estructura de una tabla

Algo ms complicado es modificar la estructura de una tabla: aadir campos, eliminarlos, cambiar su nombre o el tipo de datos. En general, para todo ello se usar la orden "alter table". Vamos a ver las posibilidades ms habituales. Para aadir un campo usaramos "add": altertable ciudades add habitantes decimal(7); Si no se indica otra cosa, el nuevo campo se aade al final de la tabla. Si queremos que sea el primer campo, lo indicaramos aadiendo "first" al final de la orden. Tambin podemos hacer que se aada despus de un cierto campo, con "afternombreCampo". Podemos modificar el tipo de datos de un campo con "modify". Por ejemplo, podramos hacer que el campo "habitantes" no fuera un "decimal" sino un entero largo ("bigint") con: altertable ciudades modify habitantes bigint;

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Si queremos cambiar el nombre de un campo, debemos usar "change" (se debe indicar el nombre antiguo, el nombre nuevo y el tipo de datos). Por ejemplo, podramos cambiar el nombre "habitantes" por "numhabitantes": altertable ciudades change habitantes numhabitantesbigint; Si queremos borrar algn campo, usaremos "dropcolumn": altertable ciudades dropcolumnnumhabitantes; Muchas de estas rdenes se pueden encadenar, separadas por comas. Por ejemplo, podramos borrar dos campos con "alter table ciudades dropcolumnnum habitantes, dropcolumn provincia;" Finalmente, tambin podramos cambiar el nombre de una tabla con "rename": altertable ciudades rename ciudad;

Operaciones matemticas

Desde SQL podemos realizar operaciones a partir de los datos antes de mostrarlos. Por ejemplo, podemos mostrar cual era la edad de una persona hace un ao, con select edad-1 from personas; Los operadores matemticos que podemos emplear son los habituales en cualquier lenguaje de programacin, ligeramente ampliados: + (suma), - (resta y negacin), * (multiplicacin), / (divisin) . La divisin calcula el resultado con decimales; si queremos trabajar con nmeros enteros, tambin tenemos los operadores DIV (divisin entera) y MOD (resto de la divisin): select 5/2, 5 div 2, 5 mod 2; Dara como resultado +--------+---------+---------+ | 5/2 | 5 div 2 | 5 mod 2 |

+--------+---------+---------+ | 2.5000 | 2| 1|

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

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital.

Tambin podramos utilizar incluso operaciones a nivel de bits, como las del lenguaje C: select 25 >> 1, 25 > 1 | 25 24; que mostrara +----------+------+ | count(*) | edad | +----------+------+ | 1 | 25 |

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

Qu es una subconsulta?

A veces tenemos que realizar operaciones ms complejas con los datos, operaciones en las que nos interesara ayudarnos de una primera consulta auxiliar que extrajera la informacin en la que nos queremos basar. Esta consulta auxiliar recibe el nombre de "subconsulta" o "subquery". Por ejemplo, si queremos saber qu clientes tenemos en la ciudad que ms habitantes tenga, la forma "razonable" de conseguirlo sera saber en primer lugar cual es la ciudad que ms habitantes tenga, y entonces lanzar una segunda consulta para ver qu clientes hay en esa ciudad. Como la estructura de nuestra base de datos de ejemplo es muy sencilla, no podemos hacer grandes cosas, pero un caso parecido al anterior (aunque claramente ms intil) podra ser saber qu personas tenemos almacenadas que vivan en la ltima ciudad de nuestra lista. Para ello, la primera consulta (la "subconsulta") sera saber cual es la ltima ciudad de nuestra lista. Si lo hacemos tomando la que tenga el ltimo cdigo, la consulta podra ser SELECTMAX(codigo) FROM ciudades;

Vamos a imaginar que pudiramos hacerlo en dos pasos. Si llamamos "maxCodigo" a ese cdigo obtenido, la "segunda" consulta podra ser:

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. SELECT * FROM personas WHERE codciudad= maxCodigo;

Pero estos dos pasos se pueden dar en uno: al final de la "segunda" consulta (la "grande") incluimos la primera consulta (la "subconsulta"), entre parntesis, as SELECT * FROM personas WHERE codciudad= ( SELECTMAX(codigo) FROM ciudades );

Subconsultas que devuelven conjuntos de datos

Si la subconsulta no devuelve un nico dato, sino un conjunto de datos, la forma de trabajar ser bsicamente la misma, pero para comprobar si el valor coincide con uno de la lista, no usaremos el smbolo "=", sino la palabra "in". Por ejemplo, vamos a hacer una consulta que nos muestre las personas que viven en ciudades cuyo nombre tiene una "a" en segundo lugar (por ejemplo, seran ciudades vlidas Madrid o Barcelona, pero no Alicante). Para consultar qu letras hay en ciertas posiciones de una cadena, podemos usar SUBSTRING (en el prximo apartado veremos las funciones ms importantes de manipulacin de cadenas). As, una forma de saber qu ciudades tienen una letra A en su segunda posicin sera: SELECT codigo FROM ciudades WHERE SUBSTRING(nombre,2,1)='a';

Como esta subconsulta puede tener ms de un resultado, deberemos usar IN para incluirla en la consulta principal, que quedara de esta forma: SELECT * FROM personas WHERE codciudad IN (

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. SELECT codigo FROM ciudades WHERE SUBSTRING(nombre,2,1)='a' );

Funciones de cadena
En MySQL tenemos muchas funciones para manipular cadenas: calcular su longitud, extraer un fragmento situado a la derecha, a la izquierda o en cualquier posicin, eliminar espacios finales o iniciales, convertir a hexadecimal y a binario, etc. Vamos a comentar las ms habituales. Los ejemplos estarn aplicados directamente sobre cadenas, pero (por supuesto) tambin se pueden aplicar a campos de una tabla: Funciones de conversin a maysculas/minsculas LOWER o LCASE convierte una cadena a minsculas: SELECTLOWER('Hola'); -> hola UPPER o UCASE convierte una cadena a maysculas: SELECTUPPER('Hola'); -> HOLA Funciones de extraccin de parte de la cadena LEFT(cadena, longitud) extrae varios caracteres del comienzo (la parte izquierda) de la cadena: SELECTLEFT('Hola',2); -> Ho RIGHT(cadena, longitud) extrae varios caracteres del final (la parte derecha) de la cadena: SELECTRIGHT('Hola',2); -> la MID(cadena, posicin, longitud), SUBSTR(cadena, posicin, longitud) o SUBSTRING(cadena, posicin, longitud) extrae varios caracteres de cualquier posicin de una cadena, tantos como se indique en "longitud": SELECTSUBSTRING('Hola',2,2); ->ol (Nota: a partir MySQL 5 se permite un valor negativo en la posicin, y entonces se comienza a contar desde la derecha -el final de la cadena-) CONCAT une (concatena) varias cadenas para formar una nueva: SELECTCONCAT('Ho', 'la'); -> Hola CONCAT_WS une (concatena) varias cadenas para formar una nueva, usando un separador que se indique (WithSeparator): SELECTCONCAT_WS('-','Ho','la','Que','tal'); -> Ho-la-Que-tal LTRIM devuelve la cadena sin los espacios en blanco que pudiera contener al principio (en su parte izquierda): SELECTLTRIM(' Hola'); -> Hola RTRIM devuelve la cadena sin los espacios en blanco que pudiera contener al final (en su parte derecha): SELECTRTRIM('Hola '); -> Hola

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. TRIM devuelve la cadena sin los espacios en blanco que pudiera contener al principio ni al final: SELECTTRIM(' Hola '); -> Hola (Nota: realmente, TRIM puede eliminar cualquier prefijo, no slo espacios; mira el manual de MySQL para ms detalles)

Funciones de conversin de base numrica


BIN convierte un nmero decimal a binario: SELECTBIN(10); -> 1010 HEX convierte un nmero decimal a hexadecimal: SELECTHEX(10); -> 'A' (Nota: HEX tambin puede recibir una cadena, y entonces mostrar el cdigo ASCII en hexadecimal de sus caracteres: SELECTHEX('Hola'); -> '486F6C61') OCT convierte un nmero decimal a octal: SELECTOCT(10); -> 12 CONV(nmero,baseInicial,baseFinal) convierte de cualquier base a cualquier base: SELECTCONV('F3',16,2); -> 11110011 UNHEX convierte una serie de nmeros hexadecimales a una cadena ASCII, al contrario de lo que hace HEX: SELECTUNHEX('486F6C61'); -> 'Hola') Otras funciones de modificacin de la cadena INSERT(cadena,posicin,longitud,nuevaCadena) inserta en la cadena otra cadena: SELECTINSERT('Hola', 2, 2, 'ADIOS'); ->HADIOSa REPLACE(cadena,de,a) devuelve la cadena pero cambiando ciertas secuencias de caracteres por otras: SELECTREPLACE('Hola', 'l', 'LLL'); ->HoLLLa REPEAT(cadena,numero) devuelve la cadena repetida varias veces: SELECTREPEAT(' Hola',3); ->HolaHolaHola REVERSE(cadena) devuelve la cadena "del revs": SELECT REVERSE('Hola'); ->aloH SPACE(longitud) devuelve una cadena formada por varios espacios en blanco: SELECTSPACE(3); -> " " Funciones de informacin sobre la cadena CHAR_LENGTH o CHARACTER_LENGTH devuelve la longitud de la cadena en caracteres LENGTH devuelve la longitud de la cadena en bytes

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. BIT_LENGTH devuelve la longitud de la cadena en bits INSTR(cadena,subcadena) o LOCATE(subcadena,cadena,posInicial) devuelve la posicin de una subcadena dentro de la cadena: SELECTINSTR('Hola','ol'); -> 2 (Ms detalles en el apartado 12.3 del manual de referencia MySQL 5.0)

Los "join"
Sabemos enlazar varias tablas para mostrar datos que estn relacionados. Por ejemplo, podramos mostrar nombres de deportistas, junto con los nombres de los deportes que practican. Pero todava hay un detalle que se nos escapa: cmo hacemos si queremos mostrar todos los deportes que hay en nuestra base de datos, incluso aunque no haya deportistas que los practiquen? Vamos a crear una base de datos sencilla para ver un ejemplo de cual es este problema y de cmo solucionarlo. Nuestra base de datos se llamar "ejemploJoins": createdatabaseejemploJoins; useejemploJoins;

En ella vamos a crear una primera tabla en la que guardaremos "capacidades" de personas (cosas que saben hacer): createtable capacidad( codigovarchar(4), nombrevarchar(20), primarykey(codigo) );

Tambin crearemos una segunda tabla con datos bsicos de personas: createtable persona(

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. codigovarchar(4), nombrevarchar(20), codcapacvarchar(4), primarykey(codigo) );

Vamos a introducir datos de ejemplo: insert into capacidad values ('c','Progr.C'), ('pas','Progr.Pascal'), ('j','Progr.Java'), ('sql','Bases datos SQL');

insert into persona values ('ju','Juan','c'), ('ja','Javier','pas'), ('jo','Jose','perl'), ('je','Jesus','html');

Antes de seguir, comprobamos que todo est bien: select * from capacidad;

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

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. | codigo | nombre |

+--------+-----------------+ |c |j | pas | sql | Progr.C | Progr.Java | |

| Progr.Pascal | | Bases datos SQL |

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

select * from persona;

+--------+--------+----------+ | codigo | nombre | codcapac | +--------+--------+----------+ | ja | je | jo | ju | Javier | pas | Jesus | html | Jose | perl | Juan | c | | | |

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

Como se puede observar, hay dos capacidades en nuestra base de datos para las que no conocemos a ninguna persona; de igual modo, existen dos personas que tienen capacidades sobre las que no tenemos ningn detalle. Por eso, si mostramos las personas con sus capacidades de la forma que sabemos, slo aparecern las parejas de persona y capacidad para las que todo est claro (existe persona y existe capacidad), es decir:

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. select * from capacidad, persona wherepersona.codcapac = capacidad.codigo;

+--------+--------------+--------+--------+----------+ | codigo | nombre | codigo | nombre | codcapac |

+--------+--------------+--------+--------+----------+ |c | pas | Progr.C | ju | Juan | c | Javier | pas | |

| Progr.Pascal | ja

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

Podemos resumir un poco esta consulta, para mostrar slo los nombres, que son los datos que ms nos interesan: selectpersona.nombre, capacidad.nombre from persona, capacidad wherepersona.codcapac = capacidad.codigo;

+--------+--------------+ | nombre | nombre +--------+--------------+ | Juan | Progr.C | |

| Javier | Progr.Pascal | +--------+--------------+

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Hay que recordar que la orden "where" es obligatoria: si no indicamos esa condicin, se mostrara el "producto cartesiano" de las dos tablas: todos los parejas (persona, capacidad), aunque no estn relacionados en nuestra base de datos: selectpersona.nombre, capacidad.nombre from persona, capacidad;

+--------+-----------------+ | nombre | nombre |

+--------+-----------------+ | Javier | Progr.C | Jesus | Progr.C | Jose | Progr.C | Juan | Progr.C | Javier | Progr.Java | Jesus | Progr.Java | Jose | Progr.Java | Juan | Progr.Java | | | | | | | |

| Javier | Progr.Pascal | | Jesus | Progr.Pascal | | Jose | Progr.Pascal | Juan | Progr.Pascal | |

| Javier | Bases datos SQL | | Jesus | Bases datos SQL | | Jose | Bases datos SQL |

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. | Juan | Bases datos SQL | +--------+-----------------+

Pues bien, con rdenes "join" podemos afinar cmo queremos enlazar (en ingls, "join", unir) las tablas. Por ejemplo, si queremos ver todas las personas y todas las capacidades, aunque no estn relacionadas (algo que no tiene sentido en la prctica), como en el ejemplo anterior, lo podramos hacer con un "crossjoin": selectpersona.nombre, capacidad.nombre from persona crossjoin capacidad;

+--------+-----------------+ | nombre | nombre |

+--------+-----------------+ | Javier | Progr.C | Jesus | Progr.C | Jose | Progr.C | Juan | Progr.C | Javier | Progr.Java | Jesus | Progr.Java | Jose | Progr.Java | Juan | Progr.Java | | | | | | | |

| Javier | Progr.Pascal | | Jesus | Progr.Pascal | | Jose | Progr.Pascal | Juan | Progr.Pascal | |

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. | Javier | Bases datos SQL | | Jesus | Bases datos SQL | | Jose | Bases datos SQL | | Juan | Bases datos SQL | +--------+-----------------+

Si slo queremos ver los datos que coinciden en ambas tablas, lo que antes conseguamos comparando los cdigos con un "where", tambin podemos usar un "innerjoin" (unin interior; se puede abreviar simplemente "join"): selectpersona.nombre, capacidad.nombre from persona innerjoin capacidad onpersona.codcapac = capacidad.codigo;

+--------+--------------+ | nombre | nombre +--------+--------------+ | Juan | Progr.C | |

| Javier | Progr.Pascal | +--------+--------------+

Pero aqu llega la novedad: si queremos ver todas las personas y sus capacidades, incluso para aquellas personas cuya capacidad no est detallada en la otra tabla, usaramos un "leftjoin" (unin por la izquierda, tambin se puede escribir "leftouterjoin", unin exterior por la izquierda, para dejar claro que se van a incluir datos que estn slo en una de las dos tablas): selectpersona.nombre, capacidad.nombre from persona leftouterjoin capacidad

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. onpersona.codcapac = capacidad.codigo;

+--------+--------------+ | nombre | nombre +--------+--------------+ | Javier | Progr.Pascal | | Jesus | NULL | Jose | NULL | Juan | Progr.C | | | |

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

De igual modo, si queremos ver todas las capacidades, incluso aquellas para las que no hay detalles sobre personas, podemos escribir el orden de las tablas al revs en la consulta anterior, o bien usar "rightjoin" (o "rightouterjoin"): selectpersona.nombre, capacidad.nombre from persona rightouterjoin capacidad onpersona.codcapac = capacidad.codigo;

+--------+-----------------+ | nombre | nombre |

+--------+-----------------+ | Juan | Progr.C | NULL | Progr.Java | Javier | Progr.Pascal | | |

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. | NULL | Bases datos SQL | +--------+-----------------+

Otros gestores de bases de datos permiten combinar el "rightjoin" y el "leftjoin" en una nica consulta, usando "full outerjoin", algo que no permite MySQL en su versin actual. (Ms detalles en el apartado 13.2.7.1 del manual de referencia MySQL 5.0)

Union, Vistas

En el apartado anterior comentbamos que la versin actual de MySQL no permite usar "full outerjoin" para mostrar todos los datos que hay en dos tablas enlazadas, aunque alguno de esos datos no tenga equivalencia en la otra tabla. Tambin decamos que se podra imitar haciendo a la vez un "rightjoin" y un "leftjoin". En general, tenemos la posibilidad de unir dos consultas en una usando "union", as: selectpersona.nombre, capacidad.nombre from persona rightouterjoin capacidad onpersona.codcapac = capacidad.codigo union selectpersona.nombre, capacidad.nombre from persona left outer join capacidad onpersona.codcapac = capacidad.codigo; +--------+-----------------+ | nombre | nombre |

+--------+-----------------+ | Juan | Progr.C |

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. | NULL | Progr.Java | Javier | Progr.Pascal | | NULL | Bases datos SQL | | Jesus | NULL | Jose | NULL | | |

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

Nota: en algunos gestores de bases de datos, podemos no slo crear "uniones" entre dos tablas, sino tambin realizar otras operaciones habituales entre conjuntos, como calcular su interseccin ("intersection") o ver qu elementos hay en la primera pero no en la segunda (diferencia, "difference"). Estas posibilidades no estn disponibles en la versin actual de MySQL.

Implementacin en el Navicat Premium

/* Navicat MySQL Data Transfer

Source Server

: local

Source Server Version : 50141 Source Host : localhost:3306

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. Source Database : cdcol

Target Server Type

: MYSQL

Target Server Version : 50141 File Encoding : 65001

Date: 2011-06-16 23:44:30 */

SET FOREIGN_KEY_CHECKS=0; -- ----------------------------- Table structure for `contactos` -- ---------------------------DROP TABLE IF EXISTS `contactos`; CREATE TABLE `contactos` ( `id_c` int(11) NOT NULL AUTO_INCREMENT, `nombre1` varchar(50) COLLATE latin1_general_ci NOT NULL, `nombre2` varchar(50) COLLATE latin1_general_ci NOT NULL, `ape_pat` varchar(50) COLLATE latin1_general_ci NOT NULL, `ape_mat` varchar(50) COLLATE latin1_general_ci NOT NULL, `empresa` varchar(50) COLLATE latin1_general_ci NOT NULL, `direccion` varchar(50) COLLATE latin1_general_ci NOT NULL, `telefono1` decimal(10,0) NOT NULL, `teleono2` decimal(10,0) NOT NULL, `celular` decimal(10,0) NOT NULL, `otro` decimal(10,0) NOT NULL, `correo` varchar(50) COLLATE latin1_general_ci NOT NULL,

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. `id_tc` int(11) NOT NULL, `rfc` varchar(15) COLLATE latin1_general_ci NOT NULL, `fecha_captura` date NOT NULL, `id_s` int(11) NOT NULL, PRIMARY KEY (`id_c`), KEY `id_tc` (`id_tc`), KEY `id_s` (`id_s`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- ----------------------------- Records of contactos -- ----------------------------

-- ----------------------------- Table structure for `estatus` -- ---------------------------DROP TABLE IF EXISTS `estatus`; CREATE TABLE `estatus` ( `id_s` int(11) NOT NULL AUTO_INCREMENT, `descripcion` varchar(50) COLLATE latin1_general_ci NOT NULL, PRIMARY KEY (`id_s`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- ----------------------------- Records of estatus -- ----------------------------

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. -- ----------------------------- Table structure for `eventos` -- ---------------------------DROP TABLE IF EXISTS `eventos`; CREATE TABLE `eventos` ( `id_e` int(11) NOT NULL AUTO_INCREMENT, `descripcion` varchar(50) COLLATE latin1_general_ci NOT NULL, `id_c` int(11) NOT NULL, `fecha` datetime NOT NULL, PRIMARY KEY (`id_e`), KEY `id_c` (`id_c`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- ----------------------------- Records of eventos -- ----------------------------

-- ----------------------------- Table structure for `tipo_contactos` -- ---------------------------DROP TABLE IF EXISTS `tipo_contactos`; CREATE TABLE `tipo_contactos` ( `id_tc` int(11) NOT NULL, `descripcion` varchar(50) COLLATE latin1_general_ci NOT NULL, PRIMARY KEY (`id_tc`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. -- ----------------------------- Records of tipo_contactos -- ----------------------------

-- ----------------------------- Table structure for `tipo_usuario` -- ---------------------------DROP TABLE IF EXISTS `tipo_usuario`; CREATE TABLE `tipo_usuario` ( `id_tu` int(11) NOT NULL AUTO_INCREMENT, `descripcion` varchar(50) COLLATE latin1_general_ci DEFAULT NULL, `id_s` int(11) DEFAULT NULL, PRIMARY KEY (`id_tu`), KEY `id_s` (`id_s`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- ----------------------------- Records of tipo_usuario -- ----------------------------

-- ----------------------------- Table structure for `usuarios` -- ---------------------------DROP TABLE IF EXISTS `usuarios`; CREATE TABLE `usuarios` ( `id_u` int(11) NOT NULL AUTO_INCREMENT, `nombre1` varchar(50) COLLATE latin1_general_ci NOT NULL,

ADMINISTRACIN DE BASE DE DATOS CENTRO UNIVERSITARIO FELIPE CARRILLO PUERTO CATEDRTICO: Miguel Suaste Proyecto: Agenda Digital. `nombre2` varchar(50) COLLATE latin1_general_ci NOT NULL, `ape_pat` varchar(50) COLLATE latin1_general_ci NOT NULL, `ape_mat` varchar(50) COLLATE latin1_general_ci NOT NULL, `correo1` varchar(50) COLLATE latin1_general_ci NOT NULL, `correo2` varchar(50) COLLATE latin1_general_ci NOT NULL, `telefono` decimal(10,0) NOT NULL, `puesto` varchar(50) COLLATE latin1_general_ci NOT NULL, `fechar_reg` date NOT NULL, `id_s` int(11) NOT NULL, PRIMARY KEY (`id_u`), KEY `id_s` (`id_s`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

-- ----------------------------- Records of usuarios -- ----------------------------

You might also like