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

Tabla de contenido MySQL ..................................................................................................... 14 DEFINICIONES............................................................................................

15
DATO ................................................................................................................................. 15 BASE DE DATOS ................................................................................................................ 15 SGBD (DBMS) .................................................................................................................... 15 CONSULTA ........................................................................................................................ 15 REDUNDANCIA DE DATOS ................................................................................................ 15 INCONSISTENCIA DE DATOS ............................................................................................. 16 INTEGRIDAD DE DATOS .................................................................................................... 16 Entidad .............................................................................................................................. 16 Conjunto de entidades: .................................................................................................... 16 Atributo............................................................................................................................. 17 Interrelacin ..................................................................................................................... 17 Grado ................................................................................................................................ 18 Dominio ............................................................................................................................ 19 MODELO RELACIONAL ...................................................................................................... 19 Diagrama Entidad - Relacin ............................................................................................ 19 Modelo Entidad-Relacin ................................................................................................. 19 Proceso de diseo en el modelo entidad/relacin .......................................................... 21 Pasos del modelado E/R al diseo de la base de datos: .................................................. 22 Clave ................................................................................................................................. 22 Claves candidatas ............................................................................................................. 23 Clave principal o primaria ................................................................................................. 23 Claves forneas e integridad referencial .......................................................................... 23 TALLER PRCTICO ............................................................................................................ 23 2. MODELO ENTIDAD/RELACION ...................................................................................... 24 MODELO E/R .................................................................................................................... 25 TALLER .............................................................................................................................. 25

COMANDOS EN MySQL ............................................................................. 27


TIPOS DE COLUMNAS ....................................................................................................... 27 TIPOS DE DATOS DE CADENAS DE CARACTERES .............................................................. 27 CHAR ................................................................................................................................. 27 CHAR () .............................................................................................................................. 27 VARCHAR () ....................................................................................................................... 27 TIPOS DE DATOS ENTEROS ............................................................................................... 28 TINYINT ............................................................................................................................. 28 SMALLINT .......................................................................................................................... 28 MEDIUMINT ...................................................................................................................... 28 INT..................................................................................................................................... 28 INTEGER ............................................................................................................................ 28 BIGINT ............................................................................................................................... 28 TIPOS DE DATOS EN COMA FLOTANTE............................................................................. 29 FLOAT ................................................................................................................................ 29 TIPOS DE COLUMNAS ....................................................................................................... 29 FLOAT () ............................................................................................................................ 29 DOUBLE ............................................................................................................................. 29 DOUBLE PRECISION .......................................................................................................... 29 REAL .................................................................................................................................. 29 DECIMAL ........................................................................................................................... 30 TIPOS DE DATOS PARA TIEMPOS ...................................................................................... 30 DATE ................................................................................................................................. 30 DATETIME ......................................................................................................................... 30 TIMESTAMP ...................................................................................................................... 30 TIME .................................................................................................................................. 31 YEAR .................................................................................................................................. 31 TIPOS DE DATOS PARA DATOS SIN TIPO O GRANDES BLOQUES DE DATOS .................... 31 TIPOS DE COLUMNAS ....................................................................................................... 32

TIPOS ENUMERADOS Y CONJUNTOS ................................................................................ 32 ENUM................................................................................................................................ 32 SET .................................................................................................................................... 32 TALLER .............................................................................................................................. 32 RELACIN ESTACIN ........................................................................................................ 33 RELACIN MUESTRA......................................................................................................... 33 TALLER .............................................................................................................................. 34

CREAR Y UTILIZAR UNA BASE DE DATOS EN MySQL ................................... 36


CREAR UNA TABLA ............................................................................................................ 37 VALORES NULOS ............................................................................................................... 38 VALORES POR DEFECTO .................................................................................................... 38 CLAVES PRIMARIAS ........................................................................................................... 39 COLUMNAS AUTOINCREMENTADAS ................................................................................ 39 COMENTARIOS ................................................................................................................. 40 NDICES ............................................................................................................................. 41 CLAVES NICAS................................................................................................................. 41 CLAVES FORNEAS ........................................................................................................... 42 OPCIONES DE TABLA......................................................................................................... 44 MOTOR DE ALMACENAMIENTO ....................................................................................... 44 VERIFICACIONES ............................................................................................................... 45 ELIMINAR UNA TABLA ...................................................................................................... 46 ELIMINAR UNA BASE DE DATOS ....................................................................................... 46 INSERCIN Y MODIFICACIN DE DATOS .......................................................................... 47 INSERCIN DE NUEVAS FILAS ........................................................................................... 47 REEMPLAZAR FILAS .......................................................................................................... 51 ACTUALIZAR FILAS ........................................................................................................... 52 ELIMINAR FILAS ................................................................................................................ 56 VACIAR UNA TABLA .......................................................................................................... 57 SELECCIN DE DATOS ....................................................................................................... 57

FORMA INCONDICIONAL .................................................................................................. 57 LIMITAR LAS COLUMNAS: PROYECCIN .......................................................................... 58 ALIAS ................................................................................................................................. 59 MOSTRAR FILAS REPETIDAS ............................................................................................. 60 LIMITAR LAS FILAS: SELECCIN ........................................................................................ 61 CLUSULA HAVING .......................................................................................................... 63 ORDENAR RESULTADOS.................................................................................................... 64 LIMITAR EL NMERO DE FILAS DE SALIDA ....................................................................... 65 OPERADORES .................................................................................................................... 66 OPERADOR DE ASIGNACIN............................................................................................. 66 OPERADORES LGICOS..................................................................................................... 67 OPERADOR Y ..................................................................................................................... 68 OPERADOR O .................................................................................................................... 68 OPERADOR O EXCLUSIVO ................................................................................................. 69 OPERADOR DE NEGACIN ................................................................................................ 70 REGLAS PARA LAS COMPARACIONES DE VALORES .......................................................... 70 OPERADORES DE COMPARACIN .................................................................................... 71 OPERADOR DE IGUALDAD ................................................................................................ 71 OPERADOR DE IGUALDAD CON NULL SEGURO ................................................................ 72 OPERADOR DE DESIGUALDAD .......................................................................................... 72 OPERADORES DE COMPARACIN DE MAGNITUD ........................................................... 72 VERIFICACIN DE NULL .................................................................................................... 73 VERIFICAR PERTENENCIA A UN RANGO ........................................................................... 74 ELECCIN DE NO NULOS .................................................................................................. 75 VALORES MXIMO Y MNIMO DE UNA LISTA .................................................................. 75 VERIFICAR CONJUNTOS .................................................................................................... 76 VERIFICAR NULOS ............................................................................................................. 77 ENCONTRAR INTERVALO .................................................................................................. 77 OPERADORES ARITMTICOS ............................................................................................. 78 OPERADOR DE ADICIN O SUMA ..................................................................................... 78

OPERADOR DE SUSTRACCIN O RESTA ............................................................................ 79 OPERADOR UNITARIO MENOS ......................................................................................... 79 OPERADOR DE PRODUCTO O MULTIPLICACIN .............................................................. 79 OPERADOR DE COCIENTE O DIVISIN .............................................................................. 80 OPERADOR DE DIVISIN ENTERA ..................................................................................... 80 OPERADORES DE BITS ....................................................................................................... 80 OPERADOR DE BITS O ....................................................................................................... 80 OPERADOR DE BITS Y ........................................................................................................ 81 OPERADOR DE BITS O EXCLUSIVO .................................................................................... 82 OPERADOR DE BITS DE COMPLEMENTO .......................................................................... 82 OPERADOR DE DESPLAZAMIENTO A LA IZQUIERDA ........................................................ 83 OPERADOR DE DESPLAZAMIENTO A LA DERECHA ........................................................... 84 OPERADORES DE CONTROL DE FLUJO .............................................................................. 84 Operador CASE ................................................................................................................. 84 OPERADORES PARA CADENAS .......................................................................................... 85 Operador LIKE ................................................................................................................... 85 Operador BINARY ............................................................................................................. 88 Tabla de precedencia de operadores ............................................................................... 88 PARENTESIS ...................................................................................................................... 89 FUNCIONES ....................................................................................................................... 89 FUNCIONES DE CONTROL DE FLUJO ................................................................................. 89 FUNCIONES MATEMTICAS ............................................................................................. 90 FUNCIONES DE CADENAS ................................................................................................. 91 FUNCIONES DE COMPARACIN DE CADENAS.................................................................. 92 FUNCIONES DE FECHA ...................................................................................................... 92 DE BSQUEDA DE TEXTO ................................................................................................. 94 FUNCIONES DE CASTING (CONVERSIN DE TIPOS).......................................................... 94 FUNCIONES DE ENCRIPDADO ........................................................................................... 94 FUNCIONES DE INFORMACIN ........................................................................................ 95 MISCELANEA ..................................................................................................................... 96

DE GRUPOS ....................................................................................................................... 96 CONSULTAS MULTITABLA ................................................................................................. 97 PRODUCTO CARTESIANO .................................................................................................. 97 COMPOSICIN (JOIN) ....................................................................................................... 99 COMPOSICIONES INTERNAS ............................................................................................. 99 COMPOSICIN INTERNA NATURAL ................................................................................ 101 COMPOSICIONES EXTERNAS........................................................................................... 102 COMPOSICIN EXTERNA IZQUIERDA ............................................................................. 103 COMPOSICIN EXTERNA DERECHA ................................................................................ 105 COMPOSICIONES NATURALES EXTERNAS ...................................................................... 105 TALLER ............................................................................................................................ 107 GUIA DE TRABAJO ........................................................................................................... 109 TALLER 1. ........................................................................................................................ 109 EJERCICO 2. ..................................................................................................................... 110

PHP ........................................................................................................ 117


VISION GENERAL ............................................................................................................. 118 HISTORIA ......................................................................................................................... 119 PHP 3............................................................................................................................... 119 PHP 4............................................................................................................................... 119 PHP 5............................................................................................................................... 119 PHP 6............................................................................................................................... 120 CARACTERSTICAS DE PHP .............................................................................................. 121 APLICACIONES DESARROLLADAS CON PHP .................................................................... 121 TRABAJANDO CON PHP .................................................................................................. 122 QU SE PUEDE HACER CON PHP? ................................................................................. 123 UNA EXPLICACIN SENCILLA .......................................................................................... 126 Qu necesito? ............................................................................................................... 126 INSTALACION DE THE APPSERV OPEN PROJECT - 2.5.7 FOR WINDOWS. (2000/NT/2003/XP) ........................................................................................................ 127 PRIMERA PGINA CON PHP............................................................................................ 133

HOLA MUNDO ................................................................................................................ 134 ESTA USANDO INTERNET EXPLORER .............................................................................. 136 SINTAXIS BSICA ............................................................................................................. 138 TIPOS DE DATOS ............................................................................................................. 140 Booleanos ....................................................................................................................... 142 Conversin a booleano ................................................................................................... 143 Enteros ............................................................................................................................ 143 Desbordamiento de enteros .......................................................................................... 144 Conversin a entero ....................................................................................................... 145 Desde booleans .............................................................................................................. 145 Nmeros de punto flotante ............................................................................................ 145 Precisin del punto flotante ........................................................................................... 146 Conversin a flotante ..................................................................................................... 146 Cadenas .......................................................................................................................... 146 ESTRUCTURA CONDICIONAL (IF) EN PHP ....................................................................... 149 ESTRUCTURAS REPETITIVAS EN PHP .............................................................................. 151 Bucle for.......................................................................................................................... 151 Bucle while...................................................................................................................... 152 Sentencias break y continue........................................................................................... 154 CONTROLES EN FORMULARIOS ...................................................................................... 156 CAJA DE TEXTO, CAJA DE CONTRASEA Y REA DE TEXTO ........................................... 157 CASILLA DE VERIFICACIN .............................................................................................. 158 BOTN RADIO................................................................................................................. 158 MEN.............................................................................................................................. 158 CONTROL OCULTO .......................................................................................................... 159 BOTN ENVIAR (SUBMIT) ............................................................................................... 159 ARCHIVO ......................................................................................................................... 159 Imagen ............................................................................................................................ 160 PROCESAMIENTO DE VARIABLES.................................................................................... 161 Sintaxis simple ................................................................................................................ 161

Sintaxis compleja (llaves)................................................................................................ 163 Acceso a cadenas y modificacin por carcter............................................................... 163 Funciones y operadores tiles ........................................................................................ 164 Conversin a cadena ...................................................................................................... 164 Conversin de cadenas a nmeros................................................................................. 165 NULL................................................................................................................................ 166 VARIABLES ...................................................................................................................... 167 Conceptos Bsicos .......................................................................................................... 167 Variables predefinidas .................................................................................................... 168 mbito de las variables .................................................................................................. 170 VARIABLES ...................................................................................................................... 175 VARIABLES EXTERNAS A PHP .......................................................................................... 176 IMAGE SUBMIT variable names...................................................................................... 178 VECTORES ASOCIATIVOS ................................................................................................ 179 FUNCIONES EN PHP ........................................................................................................ 180 PHP Y MySQL .................................................................................................................. 181 Creando la Base de datos ............................................................................................... 181 Ejercicio prctico #3........................................................................................................ 181 Conectando PHP y MySQL .............................................................................................. 183 Obteniendo registros de la Base de Datos ..................................................................... 183 Mostrando los resultados. .............................................................................................. 183 Ejemplo PHP-MySQL ....................................................................................................... 184 Cookies HTTP .................................................................................................................. 185 Puntos en los nombres de variables de entrada ............................................................ 186 Determinando los tipos de variables .............................................................................. 187 Ejercicio prctico #6........................................................................................................ 188

BIBLIOGRAFIA. ..................................................................................... 201

SQL

MDULO DE FORMACIN N

DESARROLLO DE APLICACIONESMySQL

10 HORAS DURACIN MXIMA PROYECTO Acompaamiento directo DE APLICACION Trabajo independiente Prcticas 1. COMPETENCIAS A DESARROLLAR COMPETENCIA ESPECFICA

6 HORAS 2 HORAS 2 HORAS

Elemento de competencia 01: Identificar los componentes, definiciones que Competencia: (220501007) en el momento de crear una Base de Datos en Desarrollar una Bases de Datos que MySQL cumpla con los requerimientos de la solucin informtica. Elemento de competencia 02: Demostrar los conocimientos adquiridos creando una Base de Datos en MySQL. 2. RESULTADOS (LOGROS) DE APRENDIZAJE 1. Identifica y maneja bien el concepto de bases de datos. 2. Conoce los componentes que se manejan dentro de una Base de Datos. 3. Conoce el entorno que maneja MySQL. 4. Maneja la interfaz de programacin MySQL, tablas, entidades, y diccionario de datos. 3 DE PROCESOS (SABER HACER) Aplicar el conocimiento conceptual en la administracin de bases de datos. Definir de forma gil y clara la funcionalidad de MySQL Definir y comprender el termino de Bases de Datos Crear el entorno grfico adecuado para la alimentacin de la base de datos. tener conocimientos bsicos relacionados con Base de Datos saber el fin del modelo y diseo del diagrama entidad - relacin 3.1 ACTITUDINAL ( SER) Receptivo con el conocimiento adquirido. Eficiente en las labores a realizar. Respetuoso con las normas tcnicas impuestas. Organizado y ordenado con la informacin que se esta analizando y procesando. Responsable con el manejo de la informacin suministrada Receptivo con el conocimiento adquirido.

Eficiente en las labores a realizar. Respetuoso con las normas tcnicas impuestas. Organizado y ordenado con la informacin que se esta analizando y procesando. Oportuno y veraz en la entrega de la informacin. Confidente en el manejo y administracin de la informacin. Responsable y cuidadoso con los equipos a su cargo. Organizado y ordenado con la informacin que se esta analizando y procesando. Respeta las normas de seguridad establecidas dentro de la Institucin. Organizado con la informacin. 4. CRITERIOS DE EVALUACION La informacin adquirida no la tiene clara y concisa. Sabe diferenciar los trminos que componen las bases de datos. Tiene claro el concepto de bases de datos. Sabe la funcionalidad y el fin de SGBD. puede resolver problemas teniendo en cuenta los trminos de redundancia de datos, inconsistencia de datos e integridad de datos. Sabe la funcionalidad del grado y dominio. Resuelve de forma clara el modelo relacional con todos sus componentes. Define y utiliza de forma adecuada las diferentes claves. 5. TCNICAS E INSTRUMENTOS DE EVALUACIN Algunas de las formas sugeridas de obtencin de las evidencias son: TCNICAS: Observacin contina por parte del formador durante el proceso de formacin y formulacin de preguntas y aportes por parte del estudiante. INSTRUMENTOS: Evaluaciones de Diagnostico. 6. ESTRATEGIAS METODOLGICAS El formador: Propone a los estudiantes actividades investigativas relacionados con los temas que se tratan de las bases de datos. Utilizando ejemplos prcticos involucra al estudiante en los conceptos para desarrollar el anlisis y el diagrama entidad - reilacin. Propone casos prcticos para resolver inquietudes de los estudiantes. Realiza actividad Ldica para motivar el aprendizaje del diseo de bases de datos. Evala el proceso de aprendizaje terico mediante ejemplos practicos para el diseo del diagrama entidad - relacin. El estudiante: Desarrolla gua de trabajo. Desarrolla ejercicios propuestos por el docente. Desarrolla evaluacin propuesta. 7. MEDIOS DIDCTICOS Y RECURSOS EDUCATIVOS

Laboratorios de sistemas, computadores, software, modulo gua, Internet, tablero, marcadores. 8. ESCENARIOS DE APRENDIZAJE Aula taller de clases, laboratorios de sistemas, entorno laboral y social. 9. PRERREQUISITO Poseer las competencias especficas del mdulo de Access, fox pro y MySQL. 10. PERFIL DEL FORMADOR Requisitos Acadmicos: Poseer ttulo a nivel tecnolgico o profesional en Ingeniera de sistemas. Experiencia laboral: Tener experiencia en el rea de anlisis y programacin de computadores. Competencias: Tecnlogo o Profesional en Sistemas, con experiencia en el manejo de la tecnologa informtica. Estar certificado en las normas de competencias para docentes o tener experiencia docente en el rea de por lo menos 1 ao.

MySQL
LOGROS DE APRENDIZAJE 1. 2. 3. 4. Identifica y maneja bien el concepto de bases de datos. Conoce los componentes que se manejan dentro de una Base de Datos. Conoce el entorno que maneja MySQL. Maneja la interfaz de programacin MySQL, tablas, entidades, y diccionario de datos.

Ya hemos visto que para acceder a bases de datos es mucho ms til usar un motor o servidor que hace las funciones de intrprete entre las aplicaciones y usuarios con las bases de datos. Esta utilidad se traduce en ventajas, entre las que podemos mencionar las siguientes: 1. Acceso a las bases de datos de forma simultnea por varios usuarios y/o aplicaciones. 2. Seguridad, en forma de permisos y privilegios, determinados usuarios tendrn permiso para consulta o modificacin de determinadas tablas. Esto permite compartir datos sin que peligre la integridad de la base de datos o protegiendo determinados contenidos. 3. Potencia: SQL es un lenguaje muy potente para consulta de bases de datos, usar un motor nos ahorra una enorme cantidad de trabajo. l Portabilidad: SQL es tambin un lenguaje estandarizado, de modo que las consultas hechas usando SQL son fcilmente portables a otros sistemas y plataformas. Esto, unido al uso de C/C++ proporciona una portabilidad enorme.

En concreto, usar MySQL tiene ventajas adicionales: Escalabilidad: es posible manipular bases de datos enormes, del orden de seis mil tablas y alrededor de cincuenta millones de registros, y hasta 32 ndices por tabla. MySQL est escrito en C y C++ y probado con multitud de compiladores y dispone de aplicaciones para muchas plataformas diferentes. Conectividad: es decir, permite conexiones entre diferentes mquinas con distintos sistemas operativos. Es corriente que servidores Linux o Unix, usando MySQL, sirvan datos para ordenadores con Windows, Linux, Solaris, etc. Para ello se usa TCP/IP, tuberas, o sockets Unix.

Multihilo: con lo que puede beneficiarse de sistemas multiprocesador. Permite manejar multitud de tipos para columnas. Permite manejar registros de longitud fija o variable.

DEFINICIONES
DATO
Un dato es una informacin que refleja el valor de una caracterstica de un objeto real, sea concreto o abstracto, o imaginario. Debe cumplir algunas condiciones, por ejemplo, debe permanecer en el tiempo. En ese sentido, estrictamente hablando, una edad no es un dato, ya que vara con el tiempo. El dato sera la fecha de nacimiento, y la edad se calcula a partir de ese dato y de la fecha actual. Adems, debe tener un significado, y debe ser manipulable mediante operadores: comparaciones, sumas, restas, etc. (por supuesto, no todos los datos admiten todos los operadores).

BASE DE DATOS
Podemos considerar que es un conjunto de datos de varios tipos, organizados e interrelacionados. Estos datos deben estar libres de redundancias innecesarias y ser independientes de los programas que los usan.

SGBD (DBMS)
Son las siglas que significan Sistema de Gestin de Bases de Datos, en ingls DBMS, DataBase Manager System. En este caso, MySQL es un SGBD, o mejor dicho: nuestro SGBD.

CONSULTA
Es una peticin al SGBD para que procese un determinado comando SQL. Esto incluye tanto peticiones de datos como creacin de bases de datos, tablas, modificaciones, inserciones, etc.

REDUNDANCIA DE DATOS
Decimos que hay redundancia de datos cuando la misma informacin es almacenada varias veces en la misma base de datos. Esto es siempre algo a evitar, la redundancia dificulta la tarea de modificacin de datos, y es el motivo ms frecuente de inconsistencia de datos. Adems requiere un mayor espacio de almacenamiento, que influye en mayor coste y mayor tiempo de acceso a los datos.

INCONSISTENCIA DE DATOS
Slo se produce cuando existe redundancia de datos. La inconsistencia consiste en que no todas las copias redundantes contienen la misma informacin. As, si existen diferentes modos de obtener la misma informacin, y esas formas pueden conducir a datos almacenados en distintos sitios. El problema surge al modificar esa informacin, si lo slo cambiamos esos valores en algunos de los lugares en que se guardan, las consultas que hagamos ms tarde podrn dar como resultado respuestas inconsistentes (es decir, diferentes). Puede darse el caso de que dos aplicaciones diferentes proporcionen resultados distintos para el mismo dato.

INTEGRIDAD DE DATOS
Cuando se trabaja con bases de datos, generalmente los datos se reparten entre varios ficheros. Si, como pasa con MySQL, la base de datos est disponible para varios usuarios de forma simultnea, deben existir mecanismos que aseguren que las interrelaciones entre registros se mantienen coherentes, que se respetan las dependencias de existencia y que las claves nicas no se repitan. Por ejemplo, un usuario no debe poder borrar una entidad de una base de datos, si otro usuario est usando los datos de esa entidad. Este tipo de situaciones son potencialmente peligrosas, ya que provocan situaciones con frecuencia imprevistas. Ciertos errores de integridad pueden provocar que una base de datos deje de ser usable. Los problemas de integridad se suelen producir cuando varios usuarios estn editando datos de la misma base de datos de forma simultnea. Por ejemplo, un usuario crea un nuevo registro, mientras otro edita uno de los existentes, y un tercero borra otro. El DBMS debe asegurar que se pueden realizar estas tareas sin que se produzcan errores que afecten a la integridad de la base de datos.

Entidad
Es una representacin de un objeto individual concreto del mundo real. Las entidades se representan con un rectngulo, y en su interior el nombre de la entidad: Las entidades dbiles pueden representarse mediante dos rectngulos inscritos.

Conjunto de entidades: es la clase o tipo al que pertenecen entidades con


caractersticas comunes. Cada individuo puede pertenecer a diferentes conjuntos: habitantes de un pas, empleados de una empresa, miembros de una lista de correo, etc.

Con los vehculos pasa algo similar, pueden pertenecer a conjuntos como un parque mvil, vehculos de empresa, etc.

Atributo
Los atributos se representan mediante elipses, y en su interior el nombre del atributo:

Algunas variantes de diagramas E-R usan algunas marcas para indicar que cierto atributo es una clave primaria, como subrayar el nombre del atributo. Cada una de las caractersticas que posee una entidad, y que agrupadas permiten distinguirla de otras entidades del mismo conjunto.

En el caso de las personas, los atributos pueden ser caractersticas como el nombre y los apellidos, la fecha y lugar de nacimiento, residencia, nmero de identificacin... Si se trata de una plantilla de empleados nos interesarn otros atributos, como la categora profesional, la antigedad, etc. Segn el conjunto de entidades al que hayamos asignado cada entidad, algunos de sus atributos podrn ser irrelevantes, y por lo tanto, no aparecern; pero tambin pueden ser necesarios otros. Es decir, el conjunto de atributos que usaremos para una misma entidad depender del conjunto de entidades al que pertenezca, y por lo tanto del proceso modelado. Por ejemplo, no elegiremos los mismos atributos para personas cuando formen parte de modelos diferentes. En un conjunto de entidades para los socios de una biblioteca, se necesitan ciertos atributos. Estos sern diferentes para las mismas personas, cuando se trate de un conjunto de entidades para los clientes de un banco.

Interrelacin
Es la asociacin o conexin entre conjuntos de entidades. Tengamos los dos conjuntos: de personas y de vehculos. Podemos encontrar una interrelacin entre ambos conjuntos a la que llamaremos posee, y que asocie una entidad de cada conjunto, de modo que un individuo posea un vehculo.

Las interrelaciones se representan mediante rombos, y en su interior el nombre de la interrelacin:

En los extremos de las lneas que parten del rombo se aaden unos nmeros que indican la cantidad de entidades que intervienen en la interrelacin: 1, n. Esto tambin se suele hacer modificando el extremo de las lneas. Si terminan con un extremo involucran a una entidad, si terminan en varios extremos, (generalmente tres), involucrarn a varias entidades:

Sobre las lneas a veces se aade el rol que representa cada entidad:

Grado
Nmero de conjuntos de entidades que intervienen en una interrelacin. De este modo, en la anterior interrelacin intervienen dos entidades, por lo que diremos que es de grado 2 o binaria. Tambin existen interrelaciones de grado 3, 4, etc. Pero las ms frecuentes son las interrelaciones binarias. Podemos establecer una interrelacin ternaria (de grado tres) entre personas, de modo que dos personas sean padre y madre, respectivamente, de una tercera. Existen adems tres tipos distintos de interrelaciones binarias, dependiendo del nmero de entidades del primer conjunto de entidades y del segundo. As hablaremos de interrelaciones 1:1 (uno a uno), 1: N (uno a muchos) y N: M (muchos a muchos). Nuestro ejemplo anterior de "persona posee vehculo" es una interrelacin de 1: N, ya que cada persona puede no poseer vehculo, poseer uno o poseer ms de uno. Pero cada vehculo slo puede ser propiedad de una persona. Otras relaciones, como el matrimonio, es de 1:1, o la de amistad, de N: M.

Dominio
En un conjunto de valores posibles para un atributo. A veces es conveniente aadir informacin sobre el dominio de un atributo, los dominios se representan mediante hexgonos, con la descripcin del dominio en su interior:

Una fecha de nacimiento o de matriculacin tendr casi siempre un dominio, aunque generalmente se usar el de las fechas posibles. Por ejemplo, ninguna persona puede haber nacido en una fecha posterior a la actual. Si esa persona es un empleado de una empresa, su fecha de nacimiento estar en un dominio tal que actualmente tenga entre 16 y 65 aos. Los nmeros de matrcula tambin tienen un dominio, as como los colores de chapa o los fabricantes de automviles (slo existe un nmero limitado de empresas que los fabrican). Generalmente, los dominios nos sirven para limitar el tamao de los atributos. Supongamos que una empresa puede tener un mximo de 1000 empleados. Si uno de los atributos es el nmero de empleado, podramos decir que el dominio de ese atributo es (0,1000). Con nombres o textos, los dominios limitarn su longitud mxima.

MODELO RELACIONAL
Todos los datos se representan en tablas, incluso los resultados de cualquier consulta son otra tabla. Estas tablas estn compuestas por filas y columnas, las filas y columnas en principio carecen de orden. Pero las filas solo se ordenan si se le indica a la base de datos que lo haga mediante el correspondiente comando. De no ser as el orden ser arbitrario y puede cambiar en caso de tratarse de una base de datos dinmica. El orden de las columnas lo determina cada consulta.

Diagrama Entidad - Relacin


Un diagrama E-R consiste en representar mediante estas figuras un modelo completo del problema, proceso o realidad a describir, de forma que se definan tanto las entidades que lo componen, como las interrelaciones que existen entre ellas.

Modelo Entidad-Relacin

En esencia, el modelo entidad-relacin (en adelante E-R), consiste en buscar las entidades que describan los objetos que intervienen en el problema y las relaciones entre esas entidades. Todo esto se plasma en un esquema grfico que tiene por objeto, por una parte, ayudar al programador durante la codificacin y por otra, al usuario a comprender el problema y el funcionamiento del programa. El proceso completo es iterativo, es decir, una vez terminado debemos volver al comienzo, repasar el modelo obtenido y, probablemente, modificarlo. Una vez satisfechos con el resultado (tanto nosotros, los programadores, como el cliente), ser el momento de pasar a la siguiente fase: el modelo lgico. Uno de los primeros problemas con que nos encontraremos ser decidir qu son entidades y qu atributos. La regla principal es que una entidad slo debe contener informacin sobre un nico objeto real. Pero en ciertos casos esto nos puede obligar a crear entidades con un nico atributo. Por ejemplo, si creamos una entidad para representar una persona, uno de los atributos puede ser el lugar de nacimiento. El lugar de nacimiento: poblacin, provincia o pas, puede ser considerado como una entidad. Debemos pues almacenar esa informacin como un atributo de persona o debemos, por el contrario, crear una entidad independiente?

Una regla que puede ayudarnos en esta decisin es que si una entidad slo tiene un atributo, que sirve para identificarlo, entonces esa entidad puede ser considerada como un atributo.

Otro problema frecuente se presenta con los atributos multivaluados.

Por ejemplo, cada persona puede ser localizada en varios nmeros de telfono. Considerando el telfono de contacto como un atributo de persona, podemos afirmar que tal atributo es multivaluado. Pero, aunque como su propio nombre indica no dejan de ser atributos, es mejor considerar a los atributos multivaluados como entidades dbiles subordinadas.

Breve resumen: El modelo entidad/relacin es un modelo de diseo de bases de datos. Representa los datos mediante una serie de entidades que disponen de atributos. Una entidad es una clase de objetos o conceptos claramente identificable. Las entidades establecen interrelaciones con otras entidades. El resultado de ese proceso es una base de datos normalizada que facilita el acceso a los datos y evita su duplicado.

Proceso de diseo en el modelo entidad/relacin


Se trata de identificar las entidades que debe presentar la base de datos, determinar las cardinalidades de las interrelaciones establecidas entre las distintas entidades y clasificar estas interrelaciones entre los siguientes tipos. Uno a uno: una propiedad solo tiene una direccin. Uno a muchos: en una propiedad pueden ocurrir varios incendios. Muchos a muchos: la venta de propiedades: una misma propiedad la puede vender varios propietarios y cada propietario puede vender varias propiedades.

TIPO 1:1

1:N

RELACION Una a una: la cardinalidad mxima en ambas direcciones es 1. Una a muchas: la cardinalidad mxima en una direccin es 1 y en la otra muchos

REPRESENTACION

N:M

Muchas a muchas: la cardinalidad mxima en ambas direcciones es muchos

Pasos del modelado E/R al diseo de la base de datos:


La entidad entre la que hay una interrelacin uno a uno se debe fusionar en una sola entidad. Una vez hecho esto, cada una de las entidades que puedan se convierte en una tabla con clave primaria y una serie de atributos, de los cuales algunos pueden ser claves secundarias. Las interrelaciones uno a muchos se transforman en atributo y clave secundaria de la tabla que representa a la entidad situada del lado de la interrelacin correspondiente a muchos. Las interrelaciones muchos a muchos entre dos entidades pasan a ser una tercera tabla con claves secundarias procedentes de ambas entidades. Estas claves secundarias debern formar parte de la clave primaria de la tabla en la que se convierte la interrelacin, cuando corresponda.

Clave
Es un conjunto de atributos que identifican de forma unvoca una entidad. En las entidades persona, podemos pensar que de una forma intuitiva sabemos qu atributos distinguen a dos personas distintas. Sabemos que el nombre por si mismo, desde luego, no es uno de esos atributos, ya que hay muchas personas con el mismo nombre. A menudo, el conjunto de nombre y apellidos puede ser suficiente, pero todos sabemos que existen ciertos nombres y apellidos comunes que tambin se repiten, y que esto es ms probable si se trata de personas de la misma familia. Las personas suelen disponer de un documento de identidad que suele contener un nmero que es distinto para cada persona. Pero habr aplicaciones en que este valor tampoco ser una opcin: podemos tener, por ejemplo, personas en nuestra base de datos de distintas nacionalidades, o puede que no tengamos acceso a esa informacin (una agenda personal no suele contener ese tipo de datos), tambin hay personas, como los menores de edad, que generalmente no disponen de documento de identidad. En fin, que en ocasiones, por un motivo u otro, creamos un atributo artificial para usarlo slo como clave. Esto es perfectamente legal en el modelo E-R, y se hace frecuentemente porque resulta cmodo y lgico.

Claves candidatas
Es cada una de las claves mnimas existente en un conjunto de entidades. Una caracterstica que debemos buscar siempre en las claves es que contengan el nmero mnimo de atributos, siempre que mantengan su funcin. Diremos que una clave es mnima cuando si se elimina cualquiera de los atributos que la componen, deja de ser clave. Si en una entidad existe ms de una de estas claves mnimas, cada una de ellas es una clave candidata.

Clave principal o primaria


Es una clave candidata elegida de forma arbitraria, que usaremos siempre para identificar una entidad. Cada tabla tiene una clave primaria, un identificador nico, compuesto por una o ms columnas. La mayora de las claves primarias estn formadas por una nica columna. Si disponemos de varias claves candidatas no usaremos cualquiera de ellas segn la ocasin. Esto sera fuente de errores, de modo que siempre usaremos la misma clave candidata para identificar la entidad. Las claves proporcionan una manera rpida y eficiente de buscar datos en una tabla, adems de que permiten preservar la identidad de los datos. La seleccin de una clave primaria es un elemento clave de los datos que facilita la unin de tablas y el concepto total de una base de datos relacional. La clave primaria debe ser nica y no nulas, de manera que garanticen que una fila de una tabla pueda ser siempre referenciada a travs de su clave primaria, MySQL requiere que se explique NOT NULL para las columnas que se van a utilizar como claves primarias al momento de crear una tabla.

Claves forneas e integridad referencial


La integridad referencial significa que cuando un registro en una tabla haga referencia a un registro en otra tabla, el registro correspondiente debe existir Para establecer una relacin entre dos tablas es necesario incluir, en forma de columna, en una de ellas la clave primaria de la otra. A esta columna se le llama clave fornea o secundaria.

TALLER PRCTICO
1. RELACION

Consideramos la relacion ente una tabla clientes y una tabla ventas:


CLIENTES Id_cliente Nombre VENTAS Id_factuara Id_cliente Cantidad

Para poder establecer una relacion entre dos tablas, es necesario asigar un campo en comun las dos tablas. Para este ejemplo, el id_cliente existe tanto en la tabla cliente como en la tabla venta. La mayoria de las veces, este campo en comun debe ser una clave primaria en alguna de las tablas. Vamos a inserta datos en estas tablas. Tabla clientes
Id_cliente 1 2 Nombre Jorge Orlando

tabla ventas
Id_factura 1 2 3 Id_clientes 1 3 2 Cantidad 23 39 81

Hay dos registros en la tabla cliente, pero existe 3 en id_cliente distintos en la tabla vent. Habiamos dicho que las dos tablas se relacuionan con el campo id_cliente, por lo tanto, podemos decir que Jorge tiene una cantidad de 23, y Orlando 81, sin embargo, no hay un nombre que se corresponda con id_cliente 3. La relacion de claves foraneas se describe como relacion padre/hijo (en nuestro ejemplo, cliente es el padre y venta es el hijo), y se dice que un registro es huerfano cuando su pacre ya no existe. Cuando una base de datos se da una situacin como esta, se dice que se tiene una integridad refrencial pobre. Generalmente esto va ligado a un mal diseo. Una clave foranea es simplemente un campo en uina tabla que se corresponde con la clave primaria de otra tabla. Para este ejemplo, el campo id_clientes en la tabla ventas es la clave foranea. Este campo corresponde en el campo id_clientes en la tabla clientes, en donde es la clave primaria. Las claves foraneas tienen que ver precisamente con la integridad referencia, lo que significa que si una clave foranea contiene un valor, este se refiere a un registro existente en la tabla relacionada.

2. MODELO ENTIDAD/RELACION
Dadas las siguientes tablas realizaremos el modelo entidad/relacion:

Almacen (Numero_alm, Responsable) Articulo (Cod_art, Descripcin, Precio) Material (Cod_mat, Descripcion) Proveedores (Cod_prov, Nombre, Direccion, Ciudad) Tiene (Nro_alm, cod_art, Cantidad) Compuesto_por (Cod_art, Cod_mat) Provisto_por (Cod_mat, Cod_prov) a) Como primera medida hay que reallizar las tablas para ir creando el modelo E/R b) Seleccionamos las tablas fundamentales que tienen en si relacion o campos comunes en este caso seran las atablas ALMACEN, ARTICULO, PROOVEDORES Y MATERIALES. Las demas tablas que nos muestran son las relaciones que pueden haber entre ellas, es decir, en la primera tendremos una tabla llamda almacen y otra articulo estas estaran relacionada, por el cod_ art que va crear el vinculo desde la tabla llamada tiene

MODELO E/R
ALMACEN Numero_alm Responsable
Tiene

ARTICULO Cod_art Descripcin Precio

Tiene (Nro_alm, cod_art, Cantidad) Compuesto_por (Cod_art, Cod_mat) Provisto_por (Cod_mat, Cod_prov)

Compuesto_por

PROVEEDORES Cod_prov Nombre Direccion Ciudad

Provisto_por

MATERIALES Cod_mat Descripcin

TALLER
1. TEORIA a. Escriba el equivalente de los siguientes terminos:

Termino relacional 1. Relacion 2. Grado 3. Cardinalidad 4. Atributo 5. Tupla 6. Llave principa

Equivalente Campo o dominio Cantidad de campos Tabla o entidad Identificador Registro Numero de filas

2. Definir los siguientes terminos:


TERMINO SQL Clave Dato Base de Datos SGBD (DBMS) SIGNIFICADO

3. Una Base de Datos debe contener informacin de un sistema de ventas.cada vendedor es responsablede las ventas en una o mas areas. Cada area tiene uno o ms vendedores, cada vendedor es responsable de las ventas de cada uno o ms productos. Cada producto tiene uno o ms vendedores responsables. Cada producto se vende en todas las areas sin embargpo no hay dos vendedores que vendan el mismo producto en cada area de la cual es responsable. REALIZAR EL MODELO ENTODAD//RELACION

4. Diga los tipos de ralaciones existentes y diferencia entre cada una de ellas

COMANDOS EN MySQL
LOGROS DE APRENDIZAJE Identifica y maneja bien el concepto de bases de datos. Conoce los componentes que se manejan dentro de una Base de Datos. Conoce el entorno que maneja MySQL. Conoce y maneja correctamente como sen nombran lcada tipo de variable en MySQL. 5. Maneja la sintaxis correcta para la declaracin de variables. 1. 2. 3. 4.

TIPOS DE COLUMNAS
Una vez que hemos decidido qu informacin debemos almacenar, hemos normalizado nuestras tablas y hemos creado claves principales, el siguiente paso consiste en elegir el tipo adecuado para cada atributo. En MySQL existen bastantes tipos diferentes disponibles, de modo que ser mejor que los agrupemos por categoras: de caracteres, enteros, de coma flotante, tiempos, bloques, enumerados y conjuntos.

TIPOS DE DATOS DE CADENAS DE CARACTERES CHAR


CHAR Es un sinnimo de CHAR (1), y puede contener un nico carcter.

CHAR ()
[NATIONAL] CHAR (M) [BINARY | ASCII | UNICODE] Contiene una cadena de longitud constante. Para mantener la longitud de la cadena, se rellena a la derecha con espacios. Estos espacios se eliminan al recuperar el valor. Los valores vlidos para M son de 0 a 255, y de 1 a 255 para versiones de MySQL. Si no se especifica la palabra clave BINARY estos valores se ordenan y comparan sin distinguir maysculas y minsculas. CHAR es un alias para CHARACTER.

VARCHAR ()
[NATIONAL] VARCHAR (M) [BINARY] Contiene una cadena de longitud variable. Los valores vlidos para M son de 0 a 255, y de 1 a 255 en versiones de MySQL. Los espacios al final se eliminan. Si no se especifica la palabra clave BINARY estos valores se ordenan y

comparan sin distinguir maysculas y minsculas. VARCHAR es un alias para CHARACTER VARYING.

TIPOS DE DATOS ENTEROS TINYINT


TINYINT [(M)] [UNSIGNED] [ZEROFILL] Contiene un valor entero muy pequeo. El rango con signo es entre -128 y 127. El rango sin singo, de 0 a 255.

BIT BOOL BOOLEAN Todos son sinnimos de TINYINT

SMALLINT
SMALLINT [(M)] [UNSIGNED] [ZEROFILL] Contiene un entero corto. El rango con signo es de -32768 a 32767. El rango sin singo, de 0 a 65535.

MEDIUMINT
MEDIUMINT [(M)] [UNSIGNED] [ZEROFILL] Contiene un entero de tamao medio, el rango con signo est entre -8388608 y 8388607. El rango sin signo, entre 0 y 16777215.

INT
INT [(M)] [UNSIGNED] [ZEROFILL] Contiene un entero de tamao normal. El rango con signo est entre -2147483648 y 2147483647. El rango sin singo, entre 0 y 4294967295.

INTEGER
INTEGER [(M)] [UNSIGNED] [ZEROFILL] Es sinnimo de INT.

BIGINT
BIGINT [(M)] [UNSIGNED] [ZEROFILL] Contiene un entero grande. El rango con signo es de -9223372036854775808 a 9223372036854775807. El rango sin signo, de 0 a 18446744073709551615.

TIPOS DE DATOS EN COMA FLOTANTE FLOAT


FLOAT (precisin) [UNSIGNED] [ZEROFILL] Contiene un nmero en coma flotante. Precision puede ser menor o igual que 24 para nmeros de precisin sencilla y entre 25 y 53 para nmeros en coma flotante de doble precisin. Estos tipos son idnticos que los tipos FLOAT y DOUBLE descritos a continuacin. FLOAT(X) tiene el mismo rango que los tipos FLOAT y DOUBLE correspondientes, pero el tamao mostrado y el nmero de decimales quedan indefinidos.

TIPOS DE COLUMNAS FLOAT ()


FLOAT [(M, D)] [UNSIGNED] [ZEROFILL] Contiene un nmero en coma flotante pequeo (de precisin sencilla). Los valores permitidos son entre -3.402823466E+38 y 1.175494351E-38, 0, y entre 1.175494351E-38 y 3.402823466E+38. Si se especifica el modificador UNSIGNED, los valores negativos no se permiten. El valor M es la anchura a mostrar y D es el nmero de decimales. Si se usa sin argumentos o si se usa FLOAT(X), donde X sea menor o igual que 24, se sigue definiendo un valor en coma flotante de precisin sencilla.

DOUBLE
DOUBLE [(M, D)] [UNSIGNED] [ZEROFILL] Contiene un nmero en coma flotante de tamao normal (precisin doble). Los valores permitidos estn entre 1.7976931348623157E+308 y -2.2250738585072014E-308, 0, y entre 2.2250738585072014E-308 y 1.7976931348623157E+308. Si se especifica el modificador UNSIGNED, no se permiten los valores negativos. El valor M es la anchura a mostrar y D es el nmero de decimales. Si se usa sin argumentos o si se usa FLOAT(X), donde X est entre 25 y 53, se sigue definiendo un valor en coma flotante de doble precisin.

DOUBLE PRECISION REAL


DOUBLE PRECISION [(M, D)] [UNSIGNED] [ZEROFILL]

REAL [(M, D)] [UNSIGNED] [ZEROFILL] Ambos son sinnimos de DOUBLE.

DECIMAL
DECIMAL [(M, D)] [UNSIGNED] [ZEROFILL] Contiene un nmero en coma flotante sin empaquetar. Se comporta igual que una columna CHAR: "sin empaquetar" significa que se almacena como una cadena, usando un carcter para cada dgito del valor. El punto decimal y el signo '-' para valores negativos, no se cuentan en M (pero el espacio para estos se reserva). Si D es 0, los valores no tendrn punto decimal ni decimales. El rango de los valores DECIMAL es el mismo que para DOUBLE, pero el rango actual para una columna DECIMAL dada est restringido por la eleccin de los valores M y D. Si se especifica el modificador UNSIGNED, los valores negativos no estn permitidos. Si se omite D, el valor por defecto es 0. Si se omite M, el valor por defecto es 10. DEC NUMERIC FIXED DEC [(M [, D])] [UNSIGNED] [ZEROFILL] NUMERIC [(M [, D])] [UNSIGNED] [ZEROFILL] FIXED [(M [, D])] [UNSIGNED] [ZEROFILL]

Todos ellos son sinnimos de DECIMAL.

TIPOS DE DATOS PARA TIEMPOS DATE


Contiene una fecha. El rango soportado est entre '1000-01-01' y '9999-12-31'. MySQL muestra los valores DATE con el formato 'AAAA-MM-DD', pero es posible asignar valores a columnas de este tipo usando tanto nmeros como cadenas.

DATETIME
Contiene una combinacin de fecha y hora. El rango soportado est entre '1000-01-01 00:00:00' y '9999-12-31 23:59:59'. MySQL muestra los valores DATETIME con el formato 'AAAA-MM-DD HH:MM:SS', pero es posible asignar valores a columnas de este tipo usando tanto cadenas como nmeros.

TIMESTAMP
TIMESTAMP [(M)] Contiene un valor del tipo timestamp. El rango est entre '1970-01-01 00:00:00' y algn momento del ao 2037. Hasta MySQL 4.0 los valores TIMESTAMP se mostraban como AAAAMMDDHHMMSS, AAMMDDHHMMSS, AAAAMMDD o AAMMDD,

dependiendo del si el valor de M es 14 (o se omite), 12, 8 o 6, pero est permitido asignar valores a columnas TIMESTAMP usando tanto cadenas como nmeros. Desde MySQL 4.1, TIMESTAMP se devuelve como una cadena con el formato 'AAAA-MMDD HH:MM:SS'. Para convertir este valor a un nmero, bastar con sumar el valor 0. Ya no se soportan distintas longitudes para estas columnas. Se puede asignar fcilmente la fecha y hora actual a uno de estas columnas asignando el valor NULL. El argumento M afecta slo al modo en que se visualiza la columna IMESTAMP. Los valores siempre se almacenan usando cuatro bytes. Adems, los valores de columnas TIMESTAMP (M), cuando M es 8 14 se devuelven como nmeros, mientras que para el resto de valores se devuelven como cadenas.

TIME
TIME Una hora. El rango est entre '-838:59:59' y '838:59:59'. MySQL muestra los valores TIME en el formato 'HH:MM:SS', pero permite asignar valores a columnas TIME usando tanto cadenas como nmeros.

YEAR
YEAR [(2|4)] Contiene un ao en formato de 2 4 dgitos (por defecto es 4). Los valores vlidos son entre 1901 y 2155, y 0000 en el formato de 4 dgitos. Y entre 1970-2069 si se usa el formato de 3 dgitos (70-69). MySQL muestra los valores YEAR usando el formato AAAA, pero permite asignar valores a una columna YEAR usando tanto cadenas como nmeros.

TIPOS DE DATOS PARA DATOS SIN TIPO O GRANDES BLOQUES DE DATOS


TINYBLOB TINYTEXT Contiene una columna BLOB o TEXT con una longitud mxima de 255 caracteres (28 - 1). BLOB TEXT Contiene una columna BLOB o TEXT con una longitud mxima de 65535 caracteres (216 1).MEDIUMBLOB MEDIUMTEXT

Contiene una columna BLOB o TEXT con una longitud mxima de 16777215 caracteres (224 - 1). LONGBLOB

TIPOS DE COLUMNAS
LONGTEXT LONGBLOB Contiene una columna BLOB o TEXT con una longitud mxima de 4294967298 caracteres (232 - 1).

TIPOS ENUMERADOS Y CONJUNTOS ENUM


ENUM ('valor1','valor2',...) Contiene un enumerado. Un objeto de tipo cadena que puede tener un nico valor, entre una lista de valores 'valor1', 'valor2', ..., NULL o el valor especial de error "". Un ENUM puede tener un mximo de 65535 valores diferentes.

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

TALLER
El siguiente paso del diseo nos obliga a elegir tipos para cada atributo de cada relacin. Estacin (Identificador, Latitud, Longitud, Altitud) Muestra (IdentificadorEstacin, Fecha, Temperatura mnima, Temperatura mxima, Precipitaciones, Humedad mnima, Humedad mxima, Velocidad del viento mnima, Velocidad del viento mxima) En MySQL es importante, aunque no obligatorio, usar valores enteros como claves principales, ya que las optimizaciones que proporcionan un comportamiento mucho mejor para claves enteras. Vamos a elegir el tipo de cada atributo, uno por uno:

RELACIN ESTACIN
Identificador: podramos pensar en un entero corto o medio, aunque no tenemos datos sobre el nmero de estaciones que debemos manejar, no es probable que sean ms de 16 millones. Este dato habra que incluirlo en la documentacin, pero supongamos que con MEDIUMINT UNSIGNED es suficiente. Latitud: las latitudes se expresan en grados, minutos y segundos, al norte o sur del ecuador. Los valores estn entre 'N9000'00.000"' y 'S9000'00.000"'. Adems, los segundos, dependiendo de la precisin de la posicin que almacenemos, pueden tener hasta tres decimales. Para este tipo de datos tenemos dos opciones. La primera es la que comentamos en el captulo anterior: no considerar este valor como atmico, y guardar tres nmeros y la orientacin N/S como atributos separados. Si optamos por la segunda, deberemos usar una cadena, que tendr como mximo 14 caracteres. El tipo puede ser CHAR (14) o VARCHAR (14). Longitud: las longitudes se almacenan en un formato parecido, pero la orientacin es este/oeste, y el valor de grados vara entre 0 y 180, es decir, que necesitamos un carcter ms: CHAR (15) o VARCHAR (15). Altitud: es un nmero entero, que puede ser negativo si la estacin est situada en una depresin, y como mximo a unos 8000 metros (si alguien se atreve a colocar una estacin en el Everest. Esto significa que con un MEDIUMINT tenemos ms que suficiente.

RELACIN MUESTRA
IdentificadorEstacin: se trata de una clave fornea, de modo que debe ser del mismo tipo que la clave primaria de la que procede: MEDIUMINT UNSIGNED. Fecha: slo necesitamos almacenar una fecha, de modo que con el tipo DATE ser ms que suficiente. Temperatura mnima: las temperaturas ambientes en grados centgrados (Celsius) se pueden Tipos de columnas almacenar en un entero muy pequeo, TINYINT, que permite un rango entre -128 y 127. Salvo que se siten estaciones en volcanes, no es probable que se salga de estos rangos. Recordemos que las muestras tienen aplicaciones meteorolgicas. Temperatura mxima: lo mismo que para la temperatura mnima: TINYINT. Precipitaciones: personalmente, ignoro cunto puede llegar a llover en un da, pero supongamos que 255 litros por metro cuadrado sea una cantidad que se puede superar.

En ese caso estamos obligados a usar el siguiente rango: SMALLINT UNSIGNED, que nos permite almacenar nmeros hasta 65535. Humedad mnima: las humedades se miden en porcentajes, el valor est acotado entre 0 y 100, de nuevo nos bastar con un TINYINT, nos da lo mismo con o sin signo, pero usaremos el UNSIGNED. Humedad mxima: Tambin TINYINT UNSIGNED. Velocidad del viento mnima: tambin estamos en valores siempre positivos, aunque es posible que se superen los 255 Km/h, de modo que, para estar seguros, usaremos SMALLINT UNSIGNED. Velocidad del viento mxima: tambin usaremos SMALLINT UNSIGNED.

TALLER
1. Defina y especifique las siguientes clasifiacacion de las variables y en que caoso se usan: a) Date b) Datetime c) Double d) Varchar e) Char f) Flota g) Tinyint h) Int i) Time j) Smallint 2. Escriba la correspondiente clasificacion del tipo de variable Tipo de dato 7. Char 8. Tinyint 9. Float Clasificacion Cadenas de Caracteres Datos Enteros Datos en Coma Flotante

10. Decimal 11. Date

Double Precision Datos para Tiempos

CREAR Y UTILIZAR UNA BASE DE DATOS EN MySQL


LOGROS DE APRENDIZAJE 1. Conoce los componentes que se manejan dentro de una Base de Datos. 2. Conoce el entorno que maneja MySQL. 3. Maneja la interfaz de programacin MySQL, tablas, entidades, y diccionario de datos. 4. Maneja las estructuras bsicas del lenguaje MySQL(definicin de variables, creacin de tablas, definicin de calves principales y forneas, definicin de campos y consultas) 5. Desarrolla ejercicios utilizando el modelo relacional. 6. Maneja los conceptos bsicos de Bases de Datos y los aplica en el diseo apropiado del modelo relacional (Diagrama entidad relacin). 7. Desarrollar aplicaciones y consultas bajo el entorno de MySQL. 8. Maneja y comprende la lgica de los comandos para realizar distintas tareas bajo el entorno de MySQL.

Comando para crear una base de datos y en este caso se llamara Prueba: Mysql> CREATE DATABASE Prueba; Las bases de datos solo necesitan ser creadas una sola vez, pero deben ser seleccionadas cada vez que se inicia una seseion de mysql Puede hacerse a travs del comando USE, o puede indicar la base de datos en la linea de comandos al ejecutar mysql. Simplemente debe indicar el nombre de la base de datos a continuacin de los parmetros que necesite ingresar. Podemos averiguar cuntas bases de datos existen en nuestro sistema o verificar si ya quedo creada nuestra base de datos usando la sentencia SHOW DATABASES:

Mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | Mysql | | Prueba | | Test | +--------------------+ 3 rows in set (0.00 sec) Mysql>

Al crear una base de datos, sta no se selecciona para su uso, debe hacerlo explicitamente. Para convertir a Prueba en la base de datos o ms especficamente para poder acceder o seleccionarla, use este comando:

Mysql> USE Prueba; Database changed Mysql>


Al igual que QUIT, USE no necesita que ponga un punto y coma al final (aunque puede hacerlo si lo desea). La sentencia USE tiene otra particularidad: debe escribirse en una sola linea.

CREAR UNA TABLA


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. En su forma ms simple, la sentencia CREATE TABLE crear una tabla con las columnas que indiquemos. Crearemos, como ejemplo, una tabla que nos permitir almacenar nombres de personas y sus fechas de nacimiento. Deberemos indicar el nombre de la tabla y los nombres y tipos de las columnas:

Mysql> USE prueba Database changed Mysql> CREATE TABLE gente (nombre DATE); Query OK, 0 rows affected (0.53 sec) Mysql>

VARCHAR

(40),

fecha

Hemos creado una tabla llamada "gente" con dos columnas: "nombre" que puede contener cadenas de hasta 40 caracteres y "fecha" de tipo fecha. 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) Mysql>

Pero tenemos muchas ms opciones a la hora de definir columnas. Adems del tipo y el nombre, podemos definir valores por defecto, permitir o no que contengan valores nulos, crear una clave primaria, indexar... La sintaxis para definir columnas es:

nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia]
Para verificar que la tabla ha sido creada en la forma esperada, utilice la sentencia DESCRIBE: Mysql> DESCRIBE prueba; +----------+-----------------+--------+ Field | Type | Null -----------+------------------+--------+ Name | varchar (20) | YES Owner | varchar (20) | YES DESCRIBE puede ser utilizada en cualquier momento, por ejemplo, si olvida los nombres o el tipo de dato de las columnas de la tabla.

VALORES NULOS
Al definir cada columna podemos decidir si podr o no contener valores nulos. Creacin de bases de datos Debemos recordar que, aquellas columnas que son o forman parte de una clave primaria no pueden contener valores nulos. Veremos que, si definimos una columna como clave primaria, automticamente se impide que pueda contener valores nulos, pero este no es el nico caso en que puede ser interesante impedir la asignacin de valores nulos para una columna. 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, poblacin 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 poblacin es NULL. 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, -> oblation INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.09 sec)

CLAVES PRIMARIAS
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, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.20 sec)
Usar NOT NULL PRIMARY KEY equivale a PRIMARY KEY, NOT NULL KEY o sencillamente KEY. Personalmente, prefiero usar la primera forma o la segunda. Existe una sintaxis alternativa para crear claves primarias, que en general es preferible, ya que es ms potente. De hecho, la que hemos explicado es un alias para la forma general, que no admite todas las funciones (como por ejemplo, crear claves primarias sobre varias columnas). Veremos esta otra alternativa un poco ms abajo.

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 autoincrementada 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 (clave PRIMARY KEY, -> nombre CHAR (20) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.11 sec) mysql>

INT

AUTO_INCREMENT

COMENTARIOS
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 -> (clave INT AUTO_INCREMENT PRIMARY KEY COMMENT 'Clave principal', -> nombre CHAR (50) NOT NULL, -> poblacion INT NULL DEFAULT 5000); Query OK, 0 rows affected (0.08 sec)
El ejemplo anterior que vimos para crear claves primarias, usando esta sintaxis, quedara as:

mysql> CREATE TABLE ciudad4 (nombre CHAR (20) NOT NULL, -> poblacion INT NULL DEFAULT 5000, -> PRIMARY KEY (nombre)); Query OK, 0 rows affected (0.17 sec)
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 mitabla1 ( -> id1 CHAR (2) NOT NULL, -> id2 CHAR (2) NOT NULL, -> texto CHAR (30), -> PRIMARY KEY (id1, id2)); Query OK, 0 rows affected (0.09 sec) mysql>

NDICES
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 mitabla2 ( -> id INT, -> nombre CHAR (19), -> INDEX (nombre)); Query OK, 0 rows affected (0.09 sec)
O su equivalente:

mysql> CREATE TABLE mitabla3 ( -> id INT, -> nombre CHAR (19), -> KEY (nombre)); Query OK, 0 rows affected (0.09 sec)
Tambin podemos crear un ndice sobre parte de una columna:

mysql> CREATE TABLE mitabla4 ( -> id INT, -> nombre CHAR (19), -> INDEX (nombre (4))); Query OK, 0 rows affected (0.09 sec)
Este ejemplo usar slo los cuatro primeros caracteres de la columna 'nombre' para crear el ndice.

CLAVES NICAS
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 mitabla5 ( -> id INT, -> nombre CHAR (19), -> UNIQUE (nombre)); Query OK, 0 rows affected (0.09 sec)

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 mitabla6 ( -> id INT, -> nombre CHAR (19) NOT NULL, -> UNIQUE (nombre)); Query OK, 0 rows affected (0.09 sec)
Y:

mysql> CREATE TABLE mitabla7 ( -> id INT, -> nombre CHAR (19), -> PRIMARY KEY (nombre)); Query OK, 0 rows affected (0.09 sec)
Los ndices sirven para optimizar las consultas y las bsquedas de datos. Mediante su uso es mucho ms rpido localizar filas con determinados valores de columnas, o seguir un determinado orden. La alternativa es hacer bsquedas secuenciales, que en tablas grandes requieren mucho tiempo.

CLAVES FORNEAS
En MySQL para que un campo sea clave fornea, este necesita ser definido como tal al momento de crear una tabla. InnoDB es el primer tipo de tabla que permite definir restricciones para garantizar la integridad de los datos. Aunque el InnoDB no impide usarla en otras tablas. La diferencia consiste en que en esas tablas no se verifica si una clave fornea existe realmente en la tabla referenciada, y que no se eliminan filas de una tabla con una definicin de clave fornea. Para trabajar con claves forneas, necesitamos hacer lo siguiente: Crear ambas tablas de tipo InnoDB Usar la sintaxis FOREIGN KEY (campo_fk) REFERENCES (nombre_campo) Crear un ndice en el campo que ha sido declarado clave fornea.

nombre_tabla

Para hacer esto hay que usar tablas InnoDB. Hay dos modos de definir claves forneas en bases de datos MySQL. El primero, slo sirve para documentar, y, al menos en las pruebas que he hecho, no define realmente claves forneas. Esta forma consiste en definir una referencia al mismo tiempo que se define una columna:

mysql> CREATE TABLE personas ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> nombre VARCHAR (40), -> fecha DATE); Query OK, 0 rows affected (0.13 sec) mysql> CREATE TABLE telfonos ( -> numero CHAR (12), -> id INT NOT NULL REFERENCES personas (id) -> ON DELETE CASCADE ON UPDATE CASCADE); (1) Query OK, 0 rows affected (0.13 sec) mysql>
Hemos usado una definicin de referencia para la columna 'id' de la tabla 'telfonos', indicando que es una clave fornea correspondiente a la columna 'id' de la tabla 'personas' (1). Sin embargo, aunque la sintaxis se comprueba, esta definicin no implica ningn comportamiento por parte de MySQL. El ejemplo anterior, usando tablas InnoDB y esta definicin de claves forneas quedar as:

mysql> CREATE TABLE personas2 ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> nombre VARCHAR (40), -> fecha DATE) -> ENGINE=InnoDB; Query OK, 0 rows affected (0.13 sec) mysql> CREATE TABLE telefonos2 ( -> numero CHAR (12), -> id INT NOT NULL, -> KEY (id), (2) -> FOREIGN KEY (id) REFERENCES personas2 (id) -> ON DELETE CASCADE ON UPDATE CASCADE) (3) -> ENGINE=InnoDB; Query OK, 0 rows affected (0.13 sec) mysql>
Es imprescindible que la columna que contiene una definicin de clave fornea est indexada (2). Pero esto no debe preocuparnos demasiado, ya que si no lo hacemos de forma explcita, MySQL lo har por nosotros de forma implcita. Esta forma define una clave fornea en la columna 'id', que hace referencia a la columna 'id' de la tabla 'personas' (3). La definicin incluye las tareas a realizar en el caso de que se elimine una

fila en la tabla 'personas' Creacin de bases de datos ON DELETE <opcin>, indica que acciones se deben realizar en la tabla actual si se borra una fila en la tabla referenciada. ON UPDATE <opcin>, es anlogo pero para modificaciones de claves. Existen cinco opciones diferentes. Veamos lo que hace cada una de ellas: RESTRICT: esta opcin impide eliminar o modificar filas en la tabla referenciada si existen filas con el mismo valor de clave fornea. CASCADE: borrar o modificar una clave en una fila en la tabla referenciada con un valor determinado de clave, implica borrar las filas con el mismo valor de clave fornea o modificar los valores de esas claves forneas. SET NULL: borrar o modificar una clave en una fila en la tabla referenciada con un valor determinado de clave, implica asignar el valor NULL a las claves forneas con el mismo valor. NO ACTION: las claves forneas no se modifican, ni se eliminan filas en la tabla que las contiene. SET DEFAULT: borrar o modificar una clave en una fila en la tabla referenciada con un valor determinado implica asignar el valor por defecto a las claves forneas con el mismo valor. Por ejemplo, veamos esta definicin de la tabla 'telfonos':

OPCIONES DE TABLA
La parte final de la sentencia CREATE TABLE permite especificar varias opciones para la tabla. Slo comentaremos la opcin del motor de almacenamiento, para ver el resto en detalle se puede consultar la sintaxis en CREATE TABLE.

MOTOR DE ALMACENAMIENTO
La sintaxis de esta opcin es:

{ENGINE|TYPE} {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM }

Podemos usar indistintamente ENGINE o TYPE, pero la forma recomendada es ENGINE ya que la otra desaparecer en la versin 5 de MySQL. Hay seis motores de almacenamiento disponibles. Algunos de ellos sern de uso obligatorio si queremos tener ciertas opciones disponibles. Por ejemplo, ya hemos comentado que el soporte para claves forneas slo est disponible para el motor InnoDB. Los motores son: BerkeleyDB o BDB: tablas de transaccin segura con bloqueo de pgina. HEAP o MEMORY: tablas almacenadas en memoria.

ISAM: motor original de MySQL. InnoDB: tablas de transaccin segura con bloqueo de fila y claves forneas. MERGE o MRG_MyISAM: una coleccin de tablas MyISAM usadas como una nica tabla. MyISAM: el nuevo motor binario de almacenamiento portable que reemplaza a ISAM. Generalmente usaremos tablas MyISAM o tablas InnoDB. A veces, cuando se requiera una gran optimizacin, creemos tablas temporales en memoria.

VERIFICACIONES
Disponemos de varias sentencias para verificar o consultar caractersticas de tablas. Podemos ver la estructura de una tabla usando la sentencia SHOW COLUMNS:

mysql> SHOW COLUMNS FROM gente; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | nombre | varchar(40) | YES | | NULL | | | fecha | date | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>
Tambin podemos ver la instruccin usada para crear una tabla, mediante la sentencia SHOW CREATE TABLE:

mysql> show create table gente\G ***************************1.row *************************** Table: gente Create Table: CREATE TABLE `gente` ( `nombre` varchar(40) default NULL, `fecha` date default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) mysql>
Usando '\G' en lugar de ';' la salida se muestra en forma de listado, en lugar de en forma de tabla. Este formato es ms cmodo a la hora de leer el resultado. La sentencia CREATE TABLE mostrada no tiene por qu ser la misma que se us al crear la tabla originalmente.

MySQL rellena las opciones que se activan de forma implcita, y usa siempre el mismo formato para crear claves primarias.

ELIMINAR UNA TABLA


A veces es necesario eliminar una tabla, ya sea porque es ms sencillo crearla de nuevo que modificarla, o porque ya no es necesaria. Para eliminar una tabla se usa la sentencia DROP TABLE. La sintaxis es simple:

DROP TABLE [IF EXISTS] tbl_name [, tbl_name] ...


Por ejemplo:

mysql> DROP TABLE ciudad6; Query OK, 0 rows affected (0.75 sec) mysql>
Se pueden aadir las palabras IF EXISTS para evitar errores si la tabla a eliminar no existe.

mysql> DROP TABLE ciudad6; ERROR 1051 (42S02): Unknown table 'ciudad6' mysql> DROP TABLE IF EXISTS ciudad6; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql>

ELIMINAR UNA BASE DE DATOS


De modo parecido, se pueden eliminar bases de datos completas, usando la sentencia DROP_DATABASE. La sintaxis tambin es muy simple: DROP DATABASE [IF EXISTS] db_name Hay que tener cuidado, ya que al borrar cualquier base de datos se elimina tambin cualquier tabla que contenga.

mysql> CREATE DATABASE borrame; Query OK, 1 row affected (0.00 sec) mysql> USE borrame Database changed mysql> CREATE TABLE borrame ( -> id INT, -> nombre CHAR(40) -> ); Query OK, 0 rows affected (0.09 sec) mysql> SHOW DATABASES; +--------------------+

| Database | +--------------------+ | borrame | | mysql | | prueba | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> SHOW TABLES; +-------------------+ | Tables_in_borrame | +-------------------+ | borrame | +-------------------+ 1 row in set (0.00 sec) mysql> DROP DATABASE IF EXISTS borrame; Query OK, 1 row affected (0.11 sec) mysql> DROP DATABASE IF EXISTS borrame; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql>

INSERCIN Y MODIFICACIN DE DATOS


Llegamos ahora a un punto interesante, una base de datos sin datos no sirve para mucho, de modo que veremos cmo agregar, modificar o eliminar los datos que contienen nuestras bases de datos.

INSERCIN DE NUEVAS FILAS


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 ('Pablo','1974-04-12'); Query OK, 1 row affected (0.05 sec) mysql> INSERT INTO gente VALUES ('Maria','1978-06-15'); Query OK, 1 row affected (0.04 sec)

mysql> INSERT INTO gente VALUES -> ('Tulio','2000-12-02'), -> ('Pedro','1993-02-10'); Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM gente; +---------+------------+ | nombre| fecha | +---------+------------+ | Pablo | 1974-04-12 | | Maria | 1978-06-15 | | Tulio | 2000-12-02 | | Pedro | 1993-02-10 | +---------+------------+ 4 rows in set (0.08 sec) mysql>
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 ('Paola', DEFAULT); Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM ciudad2; +---------+-----------+ | nombre | poblacion | +---------+-----------+ | Paola | 5000 | +---------+-----------+ 1 row in set (0.02 sec) mysql>
En este caso, como habamos definido un valor por defecto para poblacin de 5000, se asignar ese valor para la fila correspondiente a 'Paola'. 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 para 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) mysql>
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) mysql>
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 permitem, 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 ndice 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 mysql>
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 | +--------+-----------+

2 rows in set (0.00 sec) mysql>


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 (poblacin) usamos poblacin el nuevo valor de poblacin se ignora. Tambin podemos usar cualquier expresin:

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) mysql>

REEMPLAZAR FILAS
Existe una sentencia REPLACE, que es una alternativa para INSERT, que slo se diferencia en que si existe algn registro anterior con el mismo valor para una clave primaria o nica, se elimina el viejo y se inserta el nuevo en su lugar.

mysql> REPLACE INTO ciudad3 (nombre, poblacion) VALUES -> ('Madrid', 7200000),

-> ('Pars', 9200000), -> ('Berln', 6000000); Query OK, 5 rows affected (0.05 sec) Records: 3 Duplicates: 2 Warnings: 0 mysql> SELECT * FROM ciudad3; +--------+-----------+ | nombre | poblacion | +--------+-----------+ | Berln | 6000000 | | Madrid | 7200000 | | Pars | 9200000 | +--------+-----------+ 3 rows in set (0.00 sec) mysql>
En este ejemplo se sustituyen las filas correspondientes a 'Madrid' y 'Pars', que ya existan en la tabla y se inserta la de 'Berln' que no estaba previamente. Las mismas sintaxis que existen para INSERT, estn disponibles para REPLACE:

mysql> REPLACE INTO ciudad3 VALUES ('Roma', 9500000); Query OK, 1 rows affected (0.03 sec) mysql> REPLACE INTO ciudad3 SET poblacion=10000000; Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM ciudad3; +---------+-----------+ | nombre | poblacion | +---------+-----------+ | Berln | 6000000 | | Londres | 10000000 | | Madrid | 7200000 | | Pars | 9200000 | | Roma | 9500000 | +---------+-----------+ 5 rows in set (0.00 sec) mysql> nombre='Londres',

ACTUALIZAR FILAS
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 | +---------+-----------+ 5 rows in set (0.00 sec) mysql>
Podemos, del mismo modo, actualizar el valor de ms de una columna, separndolas en la seccin SET mediante comas:

mysql> UPDATE ciudad5 SET 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)

clave=clave+10,

mysql>
En este ejemplo hemos incrementado el valor de la columna 'clave' en 10 y disminuido el de la columna 'poblacin' 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 esta 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) mysql>
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 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) mysql>


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 | +---------+------------+ | Pablo | 1985-04-12 | | Maria | 1978-06-15 | | Tulio | 2000-12-02 | | Pedro | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec) mysql>
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 | +---------+------------+ | Pablo | 1985-04-12 | | Maria | 1978-06-15 | | Tulio | 2001-12-02 |

| Pedro | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec) mysql>


Cuando exista una clave primaria o nica, se usar ese orden por defecto, si no se especifica una clusula ORDER BY.

ELIMINAR FILAS
Para eliminar filas se usa la sentencia DELETE. La forma ms simple es no usar ninguna de las clusulas opcionales:

mysql> DELETE FROM ciudad3; Query OK, 5 rows affected (0.05 sec) mysql>
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) mysql>
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) mysql>

VACIAR UNA TABLA


Cuando queremos eliminar todas las filas de una tabla, vimos en el punto anterior que podamos usar una sentencia DELETE sin condiciones. Sin embargo, existe una sentencia alternativa, TRUNCATE, que realiza la misma tarea de una forma mucho ms rpida. La diferencia es que DELETE hace un borrado secuencial de la tabla, fila a fila. Pero TRUNCATE borrala tabla y la vuelve a crear vaca, lo que es mucho ms eficiente.

mysql> TRUNCATE ciudad5; Query OK, 1 row affected (0.05 sec) mysql>

SELECCIN DE DATOS
Ya disponemos de bases de datos, y sabemos cmo aadir y modificar datos. Ahora aprenderemos a extraer datos de una base de datos. Para ello volveremos a usar la sentencia SELECT. La sintaxis de SELECT es compleja, pero en este captulo no explicaremos todas sus opciones. 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 | posicin} [ASC | DESC], ... [WITH ROLLUP]] [HAVING condiciones] [ORDER BY {nombre_col | expresion | posicin} [ASC | DESC] ,...] [LIMIT {[desplazamiento,] contador | contador desplazamiento}]

OFFSET

FORMA INCONDICIONAL
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 | +---------+------------+ | Pablo | 1985-04-12 | | Maria | 1978-06-15 | | Tulio | 2001-12-02 | | Pedro | 1993-02-10 | +---------+------------+ 4 rows in set (0.00 sec) mysql>

LIMITAR LAS COLUMNAS: PROYECCIN


Recordemos que una de las operaciones del lgebra relacional era la proyeccin, que consista en seleccionar determinados atributos de una relacin. 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 | +---------+ | Pablo | | Maria | | Tulio | | Pedro | +---------+ 4 rows in set (0.00 sec) mysql> SELECT clave, poblacin FROM ciudad5; Empty set (0.00 sec) mysql>
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) mysql>


Vemos que podemos usar funciones, en este ejemplo hemos usando la funcin SIN para calcular el seno de /2. En prximos captulos veremos muchas de las funciones de las que disponemos en MySQL. 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 | +---------+------------+-------------------------------| Pablo | 1985-04-12 | 19.91 | | Maria | 1978-06-15 | 26.74 | | Tulio | 2001-12-02 | 3.26 | | Pedro | 1993-02-10 | 12.07 | +---------+------------+-------------------------------4 rows in set (0.00 sec) mysql>

ALIAS
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, DATEDIFF(CURRENT_DATE(),fecha)/365 AS edad -> FROM gente; +---------+------------+-------+ | nombre | fecha | edad | +---------+------------+-------+ | Pablo | 1985-04-12 | 19.91 | | Maria | 1978-06-15 | 26.74 | | Tulio | 2001-12-02 | 3.26 | | Pedro | 1993-02-10 | 12.07 | +---------+------------+-------+ 4 rows in set (0.00 sec) mysql>

fecha,

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', 15'), -> ('Frutano', '1985-04-12'); Query OK, 2 rows affected (0.03 sec) Records: 2 Duplicates: 0 Warnings: 0 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) mysql>

'1978-06-

Vemos que existen dos valores de filas repetidos, para la fecha "1985-04-12" y para "197806-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) mysql>

LIMITAR LAS FILAS: SELECCIN


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:

mysql> SELECT * FROM gente WHERE nombre="Maria"; +---------+------------+ | nombre | fecha | +---------+------------+ | Maria | 1978-06-15 | +---------+------------+ 1 row in set (0.03 sec) mysql> SELECT * FROM gente WHERE fecha>="1986-01-01"; +--------+------------+ | nombre | fecha | +--------+------------+ | Tulio | 2001-12-02 | | Pedro | 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 | +--------+------------+ | Pedro | 1993-02-10 | +--------+------------+ 1 row in set (0.00 sec) mysql>
En una clusula WHERE se puede usar cualquier funcin disponible en MySQL, excluyendo slo las de resumen o reunin, que veremos en el siguiente punto. Esas funciones estn diseadas especficamente para usarse en clusulas GROUP BY. Tambin se puede aplicar lgica booleana para crear expresiones complejas. Disponemos de los operadores AND, OR, XOR y NOT. 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) mysql>
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 | +---------+------------+ | Maria | 1978-06-15 | | Pablo | 1985-04-12 | | Pedro | 1993-02-10 | | Tulio | 2001-12-02 | +---------+------------+ 4 rows in set (0.00 sec) mysql>
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) mysql>


Esta sentencia muestra todas las fechas diferentes y el nmero de filas para cada fecha. Existen otras funciones de resumen o reunin, como MAX(), MIN(), SUM(), AVG(), STD(), VARIANCE()... Estas funciones tambin se pueden usar sin la clusula GROUP BY siempre que no se proyecten otras columnas:

mysql> SELECT MAX(nombre) FROM gente; +-------------+ | max(nombre) | +-------------+ | Tulio | +-------------+ 1 row in set (0.00 sec) mysql>
Esta sentencia muestra el valor ms grande de 'nombre' de la tabla 'gente', es decir, el ltimo por orden alfabtico.

CLUSULA HAVING
La clusula HAVING permite hacer selecciones en situaciones en las que no es posible usar WHERE. Veamos un ejemplo completo:

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) mysql>
La clusula WHERE no se puede aplicar a columnas calculadas mediante funciones de reunin, como en este ejemplo.

ORDENAR RESULTADOS
Adems, podemos aadir una clusula de orden ORDER BY para obtener resultados ordenados por la columna que queramos:

mysql> SELECT * FROM gente ORDER BY fecha; +----------+------------+ | nombre | fecha | +----------+------------+ | Maria | 1978-06-15 | | Pimplano | 1978-06-15 | | Pablo | 1985-04-12 | | Frutano | 1985-04-12 | | Pedro | 1993-02-10 | | Tulio | 2001-12-02 | +----------+------------+ 6 rows in set (0.02 sec) mysql>
Existe una opcin para esta clusula para elegir el orden, ascendente o descendente. Se puede aadir a continuacin ASC o DESC, respectivamente. Por defecto se usa el orden ascendente, de modo que el modificador ASC es opcional.

mysql> SELECT * FROM gente ORDER BY fecha DESC; +----------+------------+ | nombre | fecha | +----------+------------+ | Tulio | 2001-12-02 | | Pedro | 1993-02-10 | | Pablo | 1985-04-12 | | Frutano | 1985-04-12 | | Maria | 1978-06-15 | | Pimplano | 1978-06-15 |

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

LIMITAR EL NMERO DE FILAS DE SALIDA


Por ltimo, la clusula LIMIT permite limitar el nmero de filas devueltas:

mysql> SELECT * FROM gente LIMIT 3; +---------+------------+ | nombre | fecha | +---------+------------+ | Pedro | 1985-04-12 | | Maria | 1978-06-15 | | Tulio | 2001-12-02 | +---------+------------+ 3 rows in set (0.19 sec) mysql>
Esta clusula se suele usar para obtener filas por grupos, y no sobrecargar demasiado al servidor, o a la aplicacin que recibe los resultados. Para poder hacer esto la clusula LIMIT admite dos parmetros. Cuando se usan los dos, el primero indica el nmero de la primera fila a recuperar, y el segundo el nmero de filas a recuperar. Podemos, por ejemplo, recuperar las filas de dos en dos:

mysql> Select * from gente limit 0,2; +---------+------------+ | nombre | fecha | +---------+------------+ | Pablo | 1985-04-12 | | Maria | 1978-06-15 | +---------+------------+ 2 rows in set (0.00 sec) mysql> Select * from gente limit 2,2; +--------+------------+ | nombre | fecha | +--------+------------+ | Tulio | 2001-12-02 | | Pedro | 1993-02-10 | +--------+------------+ 2 rows in set (0.02 sec) mysql> Select * from gente limit 4,2; +----------+------------+ | nombre | fecha |

+----------+------------+ | Pimplano | 1978-06-15 | | Frutano | 1985-04-12 | +----------+------------+ 2 rows in set (0.00 sec) mysql> Select * from gente limit 6,2; Empty set (0.00 sec) mysql>

OPERADORES
MySQL dispone de multitud de operadores diferentes para cada uno de los tipos de columna. Esos operadores se utilizan para construir expresiones que se usan en clusulas ORDER BY y HAVING de la sentencia SELECT y en las clusulas WHERE de las sentencias SELECT, DELETE y UPDATE. Adems se pueden emplear en sentencias SET.

OPERADOR DE ASIGNACIN
En MySQL podemos crear variables y usarlas posteriormente en expresiones. Para crear una variable hay dos posibilidades. La primera consiste en ulsar la sentencia SET de este modo:

mysql> SET @hoy = CURRENT_DATE(); Query OK, 0 rows affected (0.02 sec) mysql> SELECT @hoy; +------------+ | @hoy | +------------+ | 2005-03-23 | +------------+ 1 row in set (0.00 sec) mysql>
La otra alternativa permite definir variables de usuario dentro de una sentencia SELECT:

mysql> SELECT @x:=10; +--------+ | @x:=10 | +--------+ | 10 | +--------+ 1 row in set (0.00 sec) mysql> SELECT @x; +----+

| @x | +----+ | 10 | +----+ 1 row in set (0.00 sec) mysql>


En esta segunda forma es donde se usa el operador de asignacin :=. Otros ejemplos del uso de variables de usuario pueden ser:

mysql> SELECT @fecha_min:=MIN(fecha), @fecha_max:=MAX(fecha) FROM gente; +------------------------+------------------------+ | @fecha_min:=MIN(fecha) | @fecha_max:=MAX(fecha) | +------------------------+------------------------+ | 1978-06-15 | 2001-12-02 | +------------------------+------------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM gente WHERE fecha=@fecha_min; +----------+------------+ | nombre | fecha | +----------+------------+ | Maria | 1978-06-15 | | Pimplano | 1978-06-15 | +----------+------------+ 2 rows in set (0.00 sec) mysql>
Una variable sin asignar ser de tipo cadena y tendr el valor NULL.

OPERADORES LGICOS
Los operadores lgicos se usan para crear expresiones lgicas complejas. Permiten el uso de lgebrabooleana, y nos ayudarn a crear condiciones mucho ms precisas. En el lgebra booleana slo existen dos valores posibles para los operandos y los resultados: verdadero y falso. MySQL dispone de dos constantes para esos valores: TRUE y FALSE, respectivamente. MySQL aade un tercer valor: desconocido. Esto es para que sea posible trabajar con valores NULL. El valor verdadero se implementa como 1 o TRUE, el falso como 0 o FALSE y el desconocido como NULL.

mysql> SELECT TRUE, FALSE, NULL; +------+-------+------+

| TRUE | FALSE | NULL| +------+-------+------+ | 1 | 0 | NULL| +------+-------+------+ 1 row in set (0.00 sec) mysql>

OPERADOR Y
En MySQL se puede usar tanto la forma AND como &&, es decir, ambas formas se refieren al mismo operador: Y lgico. Se trata de un operador binario, es decir, require de dos operandos. El resultado es verdadero slo si ambos operandos son verdaderos, y falso si cualquier operando es falso. Esto se representa mediante la siguiente tabla de verdad:

Al igual que todos lo operadores binarios que veremos, el operador Y se puede asociar, es decir, se pueden crear expresiones como A AND B AND C. El hecho de que se requieran dos operandos significa que las operaciones se realizan tomando los operandos dos a dos, y estas expresiones se evalan de izquierda a derecha. Primero se evala A AND B, y el resultado, R, se usa como primer operando de la siguiente operacin R AND C.

mysql> SELECT 1 AND 0, 1 AND NULL, 0 AND NULL, 1 AND 0 AND 1; +---------+------------+------------+---------------+ | 1 AND 0 | 1 AND NULL | 0 AND NULL | 1 AND 0 AND 1 | +---------+------------+------------+---------------+ | 0 | NULL | 0 | 0 | +---------+------------+------------+---------------+ 1 row in set (0.00 sec) mysql>

OPERADOR O

En MySQL este operador tambin tiene dos formas equivalentes OR y || El operador O tambin es binario. Si ambos operandos son distintos de NULL y el resultado es verdadero si cualquiera de ellos es verdadero, y falso si ambos son falsos. Si uno de los operandos es NULL el resultado es verdadero si el otro es verdadero, y NULL en el caso contrario. La tabla de verdad es:

mysql> SELECT 1 OR 0, 1 OR NULL, 0 OR NULL, 1 OR 0 OR 1; +--------+-----------+-----------+-------------+ | 1 OR 0 | 1 OR NULL | 0 OR NULL | 1 OR 0 OR 1 | +--------+-----------+-----------+-------------+ | 1 | 1 | NULL | 1 | +--------+-----------+-----------+-------------+ 1 row in set (0.00 sec) mysql>

OPERADOR O EXCLUSIVO
XOR tambin es un operador binario, que devuelve NULL si cualquiera de los operandos es NULL. Si ninguno de los operandos es NULL devolver un valor verdadero si uno de ellos es verdadero, y falso si ambos son verdaderos o mabos falsos. La tabla de verdad ser:

mysql> SELECT 1 XOR 0, 1 XOR NULL, 0 XOR NULL, 1 XOR 0 XOR 1; +---------+------------+------------+---------------+ | 1 XOR 0 | 1 XOR NULL | 0 XOR NULL | 1 XOR 0 XOR 1 | +---------+------------+------------+---------------+ | 1 | NULL | NULL | 0 | +---------+------------+------------+---------------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE NEGACIN
El operador NOT, que tambin se puede escribir como es un operador unitario, es decir slo afecta a un operando. Si el operando es verdadero devuelve falso, y viceversa. Si el operando es NULL el valor devuelto tambin es NULL.

mysql> SELECT NOT 0, NOT 1, NOT NULL; +-------+-------+----------+ | NOT 0 | NOT 1 | NOT NULL | +-------+-------+----------+ | 1 | 0 | NULL | +-------+-------+----------+ 1 row in set (0.02 sec) mysql>

REGLAS PARA LAS COMPARACIONES DE VALORES


MySQL Sigue las siguientes reglas a la hora de comparar valores: Si uno o los dos valores a comparar son NULL, el resultado es NULL, excepto con el operador<=>, de comparacin con NULL segura. Si los dos valores de la comparacin son cadenas, se comparan como cadenas. Si ambos valores son enteros, se comparan como enteros. Los valores hexadecimales se tratan como cadenas binarias, si no se comparan con un nmero. Si uno de los valores es del tipo TIMESTAMP o DATETIME y el otro es una constante, la constante se convierte a timestamp antes de que se lleve a cabo la

comparacin. Hay que tener en cuenta que esto no se hace para los argumentos de una expresin IN (). Para estar seguro, es mejor usar siempre cadenas completas datetime/date/time strings cuando se hacen comparaciones. En el resto de los casos, los valores se comparan como nmeros en coma flotante.

OPERADORES DE COMPARACIN
Para crear expresiones lgicas, a las que podremos aplicar el lgebra de Boole, disponemos de varios operadores de comparacin. Estos operadores se aplican a cualquier tipo de columna: fechas, cadenas, nmeros, etc, y devuelven valores lgicos: verdadero o falso (1/0). Los operadores de comparacin son los habituales en cualquier lenguaje de programacin, pero adems, MySQL aade varios ms que resultan de mucha utilidad, ya que son de uso muy frecuente.

OPERADOR DE IGUALDAD
El operador = compara dos expresiones, y da como resultado 1 si son iguales, o 0 si son diferentes. Ya lo hemos usado en ejemplos anteriormente:

mysql> SELECT * FROM gente WHERE fecha="2001-12-02"; +--------+------------+ | nombre | fecha | +--------+------------+ | Tulano | 2001-12-02 | +--------+------------+ 1 row in set (0.00 sec) mysql>
En MySQL se puede comparar valores de tipos diferentes, y el resultado ser el esperado. Por ejemplo:

mysql> SELECT "0" = 0, "0.1"=.1; +---------+----------+ | "0" = 0 | "0.1"=.1 | +---------+----------+ | 1 | 1 | +---------+----------+ 1 row in set (0.00 sec) mysql>
Esto es as porque MySQL hace conversin de tipos de forma implcita, incluso cuando se trate de valores de tipo cadena.

OPERADOR DE IGUALDAD CON NULL SEGURO


El operador <=> funciona igual que el operador =, salvo que si en la comparacin una o ambas de las expresiones es nula el resultado no es NULL. Si se comparan dos expresiones nulas, el resultado es verdadero:

mysql> SELECT NULL = 1, NULL = NULL; +----------+-------------+ | NULL = 1 | NULL = NULL | +----------+-------------+ | NULL | NULL | +----------+-------------+ 1 row in set (0.00 sec) mysql> SELECT NULL <=> 1, NULL <=> NULL; +------------+---------------+ | NULL <=> 1 | NULL <=> NULL | +------------+---------------+ | 0 | 1 | +------------+---------------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE DESIGUALDAD
MySQL dispone de dos operadores equivalente para comprobar desigualdades, <> y !=. Si las expresiones comparadas son diferentes, el resultado es verdadero, y si son iguales, el resultado es falso:

mysql> SELECT 100 <> 32, 43 != 43; +-----------+----------+ | 100 <> 32 | 43 != 43 | +-----------+----------+ | 1 | 0 | +-----------+----------+ 1 row in set (0.02 sec) mysql>

OPERADORES DE COMPARACIN DE MAGNITUD


Disponemos de los cuatro operadores corrientes operador descripcin:

Estos operadores tambin permiten comparar cadenas, fechas, y por supuesto, nmeros:

mysql> SELECT "hola" < "adios", "2004-12-31" > "2004-1201"; +------------------+-----------------------------+ | "hola" < "adios" | "2004-12-31" > "2004-12-01" | +------------------+-----------------------------+ | 0 | 1 | +------------------+-----------------------------+ 1 row in set (0.00 sec) mysql> SELECT ".01" >= "0.01", .01 >= 0.01; +-----------------+-------------+ | ".01" >= "0.01" | .01 >= 0.01 | +-----------------+-------------+ | 0 | 1 | +-----------------+-------------+ 1 row in set (0.00 sec) mysql>
Cuando se comparan cadenas, se consider menor la cadena que aparezca antes por orden alfabtico. Si son fechas, se considera que es menor cuanta ms antigua sea. Pero cuidado, como vemos en el segundo ejemplo, si comparamos cadenas que contienen nmeros, no hay conversin, y se comparan las cadenas tal como aparecen.

VERIFICACIN DE NULL
Los operadores IS NULL e IS NOT NULL sirven para verificar si una expresin determinada es o no nula. La sintaxis es:

<expresin> IS NULL <expresin> IS NOT NULL


Por ejemplo:

mysql> SELECT NULL IS NULL; +--------------+ | NULL IS NULL | +--------------+ | 1 | +--------------+ 1 row in set (0.00 sec)

mysql> SELECT "NULL" IS NOT NULL; +--------------------+ | "NULL" IS NOT NULL | +--------------------+ | 1 | +--------------------+ 1 row in set (0.00 sec) mysql>

VERIFICAR PERTENENCIA A UN RANGO


Entre los operadores de MySQL, hay uno para comprobar si una expresin est comprendida en un determinado rango de valores. La sintaxis es:

<expresin> BETWEEN mnimo AND mximo <expresin> NOT BETWEEN mnimo AND mximo
En realidad es un operador prescindible, ya que se puede usar en su lugar dos expresiones de comparacin y el operador AND. Estos dos ejemplos son equivalentes:

mysql> SELECT 23 BETWEEN 1 AND 100; +----------------------+ | 23 BETWEEN 1 AND 100 | +----------------------+ | 1 | +----------------------+ 1 row in set (0.00 sec) mysql> SELECT 23 >= 1 AND 23 <= 100; +-----------------------+ | 23 >= 1 AND 23 <= 100 | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec) mysql>
Del mismo modo, estas dos expresiones tambin lo son:

mysql> SELECT 23 NOT BETWEEN 1 AND 100; +--------------------------+ | 23 NOT BETWEEN 1 AND 100 | +--------------------------+ | 0 | +--------------------------+ 1 row in set (0.00 sec)

mysql> SELECT NOT (23 BETWEEN 1 AND 100); +----------------------------+ | NOT (23 BETWEEN 1 AND 100) | +----------------------------+ | 0 | +----------------------------+ 1 row in set (0.00 sec) mysql>

ELECCIN DE NO NULOS
El operador COALESCE sirve para seleccionar el primer valor no nulo de una lista o conjunto de expresiones. La sintaxis es:

COALESCE (<expr1>, <expr2>, <expr3>...)


El resultado es el valor de la primera expresin distinta de NULL que aparezca en la lista. Por ejemplo:

mysql> SET @a=23, @b="abc", @d="1998-11-12"; Query OK, 0 rows affected (0.03 sec) mysql> SELECT COALESCE(@c, @a, @b, @d); +--------------------------+ | COALESCE(@c, @a, @b, @d) | +--------------------------+ | 23 | +--------------------------+ 1 row in set (0.05 sec) mysql>
En este ejemplo no hemos definido la variable @c, por lo tanto, tal como dijimos antes, su valor se considera NULL. El operador COALESCE devuelve el valor de la primera variable no nula, es decir, el valor de @a.

VALORES MXIMO Y MNIMO DE UNA LISTA


Los operadores GREATEST y LEAST devuelven el valor mximo y mnimo, respectivamente, de la lista de expresiones dada. La sintaxis es:

GREATEST(<expr1>, <expr2>, <expr3>...) LEAST(<expr1>, <expr2>, <expr3>...)


La lista de expresiones debe contener al menos dos valores. Los argumentos se comparan segn estas reglas:

Si el valor de retorno se usa en un contexto entero, o si todos los elementos de la lista son enteros, estos se comparan entre si como enteros. Si el valor de retorno se usa en un contexto real, o si todos los elementos son valores reales, sern comparados como reales. Si cualquiera de los argumentos es una cadena sensible al tipo (maysculas y minsculas son caracteres diferentes), los argumentos se comparan como cadenas sensibles al tipo. En cualquier otro caso, los argumentos se comparan como cadenas no sensibles al tipo.

mysql> SELECT LEAST(2,5,7,1,23,12); +----------------------------+ | LEAST (2, 5, 7, 1, 23, 12) | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.69 sec) mysql> SELECT GREATEST(2,5,7,1,23,12); +-------------------------------+ | GREATEST (2, 5, 7, 1, 23, 12) | +-------------------------------+ | 23 | +-------------------------------+ 1 row in set (0.03 sec) mysql> SELECT GREATEST(2,5,"7",1,"a",12); +--------------------------------+ | GREATEST (2, 5,"7", 1,"a", 12) | +--------------------------------+ | 12 | +--------------------------------+ 1 row in set (0.09 sec) mysql>

VERIFICAR CONJUNTOS
Los operadores IN y NOT IN sirven para averiguar si el valor de una expresin determinada est dentro de un conjunto indicado. La sintaxis es:

IN (<expr1>, <expr2>, <expr3>...) NOT IN (<expr1>, <expr2>, <expr3>...)

El operador IN devuelve un valor verdadero, 1, si el valor de la expresin es igual a alguno de los valores especificados en la lista. El operador NOT IN devuelve un valor falso en el mismo caso. Por ejemplo:

mysql> SELECT 10 IN(2, 4, 6, 8, 10); +-----------------------+ | 10 IN(2, 4, 6, 8, 10) | +-----------------------+ | 1 | +-----------------------+ 1 row in set (0.00 sec) mysql>

VERIFICAR NULOS
El operador ISNULL es equivalente a IS NULL. La sintaxis es: ISNULL(<expresin>) Por ejemplo:

mysql> SELECT 1/0 IS NULL, ISNULL(1/0); +-------------+-------------+ | 1/0 IS NULL | ISNULL(1/0) | +-------------+-------------+ | 1 | 1 | +-------------+-------------+ 1 row in set (0.02 sec) mysql>

ENCONTRAR INTERVALO
Se puede usar el operador INTERVAL para calcular el intervalo al que pertenece un valor determinado. La sintaxis es:

INTERVAL(<expresin>, <lmite1>, <limite1>, ... <limiten>)


Si el valor de la expresin es menor que lmite1, el operador regresa con el valor 0, si es mayor o igual que lmite1 y menor que limite2, regresa con el valor 1, etc. Todos los valores de los lmites deben estar ordenados, ya que MySQL usa el algoritmo de bsqueda binaria.

mysql> SET @x = 19; Query OK, 0 rows affected (0.02 sec) mysql> SELECT INTERVAL(@x, 0, 10, 20, 30, 40);

+---------------------------------+ | INTERVAL(@x, 0, 10, 20, 30, 40) | +---------------------------------+ | 2 | +---------------------------------+ 1 row in set (0.01 sec) mysql> SELECT INTERVAL("Gerardo", "Antonio", -> "Fernando", "Ramn", "Xavier"); +------------------------------------------------------| INTERVAL("Gerardo", "Antonio", "Fernando", "Ramn", "Xavier") | +------------------------------------------------------| 4 | +------------------------------------------------------1 row in set (0.01 sec) mysql>

OPERADORES ARITMTICOS
Los operadores aritmticos se aplican a valores numricos, ya sean enteros o en coma flotante. El resultado siempre es un valor numrico, entero o en coma flotante. MySQL dispone de los operadores aritmticos habituales: suma, resta, multiplicacin y divisin. En el caso de los operadores de suma, resta, cambio de signo y multiplicacin, si los operandos son enteros, el resultado se calcula usando el tipo BIGINT, es decir, enteros de 64 bits. Hay que tener esto en cuenta, sobre todo en el caso de nmeros grandes.

OPERADOR DE ADICIN O SUMA


El operador para la suma es, como cabra esperar, +. No hay mucho que comentar al respecto. Por ejemplo:

mysql> SELECT 192+342, 23.54+23; +---------+----------+ | 192+342 | 23.54+23 | +---------+----------+ | 534 | 46.54 | +---------+----------+ 1 row in set (0.00 sec) mysql>

Este operador, al igual que el de resta, multiplicacin y divisin, es binario. Como comentamos al hablar de los operadores lgicos, esto no significa que no se puedan asociar, sino que la operaciones se realizan tomando los operandos dos a dos.

OPERADOR DE SUSTRACCIN O RESTA


Tambin con la misma lgica, el operador para restar es el -. Otro ejemplo:

mysql> SELECT 192-342, 23.54-23; +---------+----------+ | 192-342 | 23.54-23 | +---------+----------+ | -150 | 0.54 | +---------+----------+ 1 row in set (0.02 sec) mysql>

OPERADOR UNITARIO MENOS


Este operador, que tambin usa el smbolo -, se aplica a un nico operando, y como resultado se obtiene un valor de signo contrario. Por ejemplo:

mysql> SET @x=100; Query OK, 0 rows affected (0.00 sec) mysql> SELECT -@x; +------+ | -@x | +------+ | -100 | +------+ 1 row in set (0.01 sec) mysql>

OPERADOR DE PRODUCTO O MULTIPLICACIN


Tambin es un operador binario, el smbolo usado es el asterisco, *. Por ejemplo:

mysql> SELECT 12343432*3123243, 312*32*12; +------------------+-----------+ | 12343432*3123243 | 312*32*12 | +------------------+-----------+ | 38551537589976 | 119808 | +------------------+-----------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE COCIENTE O DIVISIN


El resultado de las divisiones, por regla general, es un nmero en coma flotante. Por supuesto, tambin es un operador binario, y el smbolo usado es /. Dividir por cero produce como resultado el valor NULL. Por ejemplo:

mysql> SELECT 2132143/3123, 4324/25434, 43/0; +---------------+------------+------+ | 2132143/3123 | 4324/25434 | 43/0 | +---------------+------------+------+ | 682.72 | 0.17 | NULL | +---------------+------------+------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE DIVISIN ENTERA


Existe otro operador para realizar divisiones, pero que slo calcula la parte entera del cociente. El operador usado es DIV. Por ejemplo:

mysql> SELECT 2132143 DIV 3123, 4324 DIV 25434, 43 DIV 0; +------------------+----------------+----------+ | 2132143 DIV 3123 | 4324 DIV 25434 | 43 DIV 0 | +------------------+----------------+----------+ | 682 | 0 | NULL | +------------------+----------------+----------+ 1 row in set (0.00 sec) mysql>

OPERADORES DE BITS
Todos los operadores de bits trabajan con enteros BIGINT, es decir con 64 bits. Los operadores son los habituales: o, y, o exclusivo, complemento y rotaciones a derecha e izquierda.

OPERADOR DE BITS O
El smbolo empleado es |. Este operador es equivalente al operador OR que vimos para lgebra de Boole, pero se aplica bit a bit entre valores enteros de 64 bits. Las tablas de verdad para estos operadores son ms simples, ya que los bits no pueden tomar valores nulos:

Las operaciones con operadores de bits se realizan tomando los bits de cada operador uno a uno. Por ejemplo:

mysql> SELECT 234 | 334, 32 | 23, 15 | 0; +-----------+---------+--------+ | 234 | 334 | 32 | 23 | 15 | 0 | +-----------+---------+--------+ | 494 | 55 | 15 | +-----------+---------+--------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE BITS Y
El smbolo empleado es &. Este operador es equivalente al operador AND que vimos para lgebra de Boole, pero aplicado bit a bit entre valores enteros de 64 bits. La tabla de verdad para este operador es:

Al igual que con el operador |, con el operador & las operaciones se realizan tomando los bits de cada operador uno a uno. Ejemplo:

mysql> SELECT 234 & 334, 32 & 23, 15 & 0; +-----------+---------+--------+ | 234 & 334 | 32 & 23 | 15 & 0 | +-----------+---------+--------+ | 74 | 0 | 0 | +-----------+---------+--------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE BITS O EXCLUSIVO


El smbolo empleado es ^. Este operador es equivalente al operador XOR que vimos para lgebra de Boole, pero aplicado bit a bit entre valores enteros de 64 bits. La tabla de verdad para este operador es: Al igual que con los operadores anteriores, con el operador ^ las operaciones se realizan tomando los bits de cada operador uno a uno. Por ejemplo:

mysql> SELECT 234 ^ 334, 32 ^ 23, 15 ^ 0; +-----------+---------+--------+ | 234 ^ 334 | 32 ^ 23 | 15 ^ 0 | +-----------+---------+--------+ | 420 | 55 | 15 | +-----------+---------+--------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE BITS DE COMPLEMENTO


El smbolo empleado es ~. Este operador es equivalente al operador NOT que vimos para lgebra de Boole, pero aplicado bit a bit entre valores enteros de 64 bits. Se trata de un operador unitario, y la tabla de verdad es:

Al igual que con los operadores anteriores, con el operador ~ las operaciones se realizan tomando los bits del operador uno a uno. Por ejemplo:

mysql> SELECT ~234, ~32, ~15; +-------------------+----------------------+--------| ~234 | ~32 | ~15 | +----------------------+----------------------+--|18446744073709551381|18446744073709551583| 18446744073709551600 | +----------------------+----------------------+--------1 row in set (0.00 sec) mysql>
Como vemos en el ejemplo, el resultado de aplicar el operador de complemento no es un nmero negativo. Esto es porque si no se especifica lo contrario, se usan valores BIGINT

sin signo. Si se fuerza un tipo, el resultado s ser un nmero de signo contrario. Por ejemplo:

mysql> SET @x = ~1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x; +------+ | @x | +------+ | -2 | +------+ 1 row in set (0.00 sec) mysql>
Para los que no estn familiarizados con el lgebra binaria, diremos que para conseguir el negativo de un nmero no basta con calcular su complemento. Adems hay que sumar al resultado una unidad:

mysql> SET @x = ~1 +1, @y = 1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x + @y; +---------+ | @x + @y | +---------+ | 0 | +---------+ 1 row in set (0.00 sec) mysql>

OPERADOR DE DESPLAZAMIENTO A LA IZQUIERDA


El smbolo empleado es <<. Se trata de un operador binario. El resultado es que los bits del primer operando se desplazan a la izquierda tantos bits como indique el segundo operando. Por la derecha se introducen otros tantos bits con valor 0. Los bits de la parte izquierda que no caben en los 64 bits, se piden. El resultado, siempre que no se pierdan bits por la izquierda, equivale a multiplicar el primer operando por dos para cada desplazamiento. Por ejemplo:

mysql> SELECT 234 << 25, 32 << 5, 15 << 1; +------------+---------+---------+ | 234 << 25 | 32 << 5 | 15 << 1 | +------------+---------+---------+ | 7851737088 | 1024 | 30 | +------------+---------+---------+

1 row in set (0.00 sec) mysql>

OPERADOR DE DESPLAZAMIENTO A LA DERECHA


El smbolo empleado es >>. Se trata de un operador binario. El resultado es que los bits del primer operando se desplazan a la derecha tantos bits como indique el segundo operando. Por la izquierda se introducen otros tantos bits con valor 0. Los bits de la parte derecha que no caben en los 64 bits, se pierden. El resultado equivale a dividir el primer operando por dos para cada desplazamiento. Por ejemplo:

Mysql> SELECT 234 >> 25, 32 >> 5, 15 >> 1; +-----------+---------+---------+ | 234 >> 25 | 32 >> 5 | 15 >> 1 | +-----------+---------+---------+ | 0 | 1 | 7 | +-----------+---------+---------+ 1 row in set (0.00 sec) Mysql>

OPERADORES DE CONTROL DE FLUJO


En MySQL no siempre es sencillo distinguir los operadores de las funciones. En el caso del control de flujo slo veremos un operador, el CASE. El resto los veremos en el captulo de funciones.

Operador CASE
Existen dos sintaxis alternativas para CASE: La primera forma devuelve el resultado para el valori que coincida con valor. La segunda forma devuelve el resultado para la primera condicin verdadera. Si no hay coincidencias, se devuelve el valor asociado al ELSE, o NULL si no hay parte ELSE.

mysql> SET @x=1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT CASE @x WHEN 1 THEN "uno" -> WHEN 2 THEN "varios" -> ELSE "muchos" END\G ***************************1.row *************************** CASE @x WHEN 1 THEN "uno" WHEN 2 THEN "varios" ELSE "muchos" END: uno 1 row in set (0.02 sec) mysql> SET @x=2;

Query OK, 0 rows affected (0.00 sec) mysql> SELECT CASE WHEN @x=1 THEN "uno" -> WHEN @x=2 THEN "varios" -> ELSE "muchos" END\G ***************************1.row *************************** CASE WHEN @x=1 THEN "uno" WHEN @x=2 THEN "varios" ELSE "muchos" END: varios 1 row in set (0.00 sec) Mysql>

OPERADORES PARA CADENAS


MySQL dispone de varios operadores para comparacin de cadenas, con patrones y con expresiones regulares.

Operador LIKE
El operador LIKE se usa para hacer comparaciones entre cadenas y patrones. El resultado es verdadero (1) si la cadena se ajusta al patrn, y falso (0) en caso contrario. Tanto si la cadena como el patrn es NULL, el resultado es NULL. La sintaxis es: <Expresin> LIKE <patrn> [ESCAPE 'carcter _ escape'] Los patrones son cadenas de caracteres en las que pueden aparecer, en cualquier posicin, los caracteres especiales '%' y '_'. El significado de esos caracteres se puede ver en la tabla siguiente:

Por ejemplo:

Mysql> SELECT "hola" LIKE "_o%"; +-------------------+ | "hola" LIKE "_o%" | +-------------------+ | 1 | +-------------------+ 1 row in set (0.00 sec) Mysql>

La cadena "hola" se ajusta a "_o%", ya que el carcter 'h' se ajusta a la parte '_' del patrn, y la subcadena "la" a la parte '%'. La comparacin es independiente del tipo de los caracteres, es decir, LIKE no distingue maysculas de minsculas, salvo que se indique lo contrario (ver operadores de casting):

mysql> SELECT "hola" LIKE "HOLA"; +--------------------+ | "hola" LIKE "HOLA" | +--------------------+ | 1 | +--------------------+ 1 row in set (0.01 sec) mysql>
Como siempre que se usan caracteres concretos para crear patrones, se presenta la dificultad de hacer comparaciones cuando se deben buscar precisamente esos caracteres concretos. Esta dificultad se suele superar mediante secuencias de escape. Si no se especifica nada en contra, el carcter que se usa para escapar es '\'. De este modo, si queremos que nuestro patrn contenga los caracteres '%' o '_', los escaparemos de este modo: '\%' y '\_':

mysql> SELECT "%_%" LIKE "_\_\%"; +--------------------+ | "%_%" LIKE "_\_\%" | +--------------------+ | 1 | +--------------------+ 1 row in set (0.00 sec) mysql>
Pero MySQL nos permite usar otros caracteres para crear secuencias de escape, para eso se usa la clusula opcional ESCAPE:

mysql> SELECT "%_%" LIKE "_!_!%" ESCAPE '!'; +-------------------------------+ | "%_%" LIKE "_!_!%" ESCAPE '!' | +-------------------------------+ | 1 | +-------------------------------+ 1 row in set (0.00 sec) mysql>

En MySQL, LIKE tambin funciona con expresiones numricas. (Esto es una extensin a SQL.)

mysql> SELECT 1450 LIKE "1%0"; +-----------------+ | 1450 LIKE "1%0" | +-----------------+ | 1 | +-----------------+ 1 row in set (0.00 sec) mysql>
El carcter de escape no se aplica slo a los caracteres '%' y '_'. MySQL usa la misma sintaxis que C para las cadenas, de modo que los caracteres como '\n', '\r', etc tambin son secuencias de escape, y si se quieren usar como literales, ser necesario escaparlos tambin. Operador NOT LIKE La sintaxis es: <expresin> NOT LIKE <patrn> [ESCAPE 'carcter _ escape'] Equivale a: NOT (<expresin> LIKE <patrn> [ESCAPE 'carcter _ escape']) Operadores REGEXP y RLIKE La sintaxis es: <expresin> RLIKE <patrn> <expresin> REGEXP <patrn> Al igual que LIKE el operador REGEXP (y su equivalente RLIKE), comparan una expresin con un patrn, pero en este caso, el patrn puede ser una expresin regular extendida. El valor de retorno es verdadero (1) si la expresin coincide con el patrn, en caso contrario devuelve un valor falso (0). Tanto si la expresin como el patrn es nulos, el resultado es NULL. El patrn no tiene que ser necesariamente una cadena, puede ser una expresin o una columna de una tabla.

mysql> SELECT 'a' REGEXP '^[a-d]'; +---------------------+ | 'a' REGEXP '^[a-d]' | +---------------------+ | 1 | +---------------------+ 1 row in set (0.08 sec) mysql>

Operadores NOT REGEXP y NOT RLIKE La sintaxis es: <expresin> NOT RLIKE <patrn> <expresin> NOT REGEXP <patrn> Que equivalen a: NOT (<expresin> REGEXP <patrn>) Operadores de casting En realidad slo hay un operador de casting: BINARY.

Operador BINARY
El operador BINARY convierte una cadena de caracteres en una cadena binaria. Si se aplica a una cadena que forma parte de una comparacin, esta se har de forma sensible al tipo, es decir, se distinguirn maysculas de minsculas. Tambin hace que los espacios al final de la cadena se tengan en cuenta en la comparacin.

mysql> SELECT 'a' = 'A', 'a' = BINARY 'A'; +-----------+------------------+ | 'a' = 'A' | 'a' = BINARY 'A' | +-----------+------------------+ | 1 | 0 | +-----------+------------------+ 1 row in set (0.03 sec) mysql> SELECT 'a' = 'a ', 'a' = BINARY 'a '; +------------+-------------------+ | 'a' = 'a ' | 'a' = BINARY 'a ' | +------------+-------------------+ | 1 | 0 | +------------+-------------------+ 1 row in set (0.00 sec) mysql>

Tabla de precedencia de operadores


Cuando se usa en comparaciones, BINARY afecta a la comparacin en conjunto, es indiferente que se aplique a cualquiera de las dos cadenas.

PARENTESIS
Como en cualquier otro lenguaje, los parntesis se pueden usar para forzar el orden de la evaluacin de determinadas operaciones dentro de una expresin. Cualquier expresin entre parntesis adquiere mayor precedencia que el resto de las operaciones en el mismo nivel de parntesis.

mysql> SELECT 10+5*2, (10+5)*2; +--------+----------+ | 10+5*2 | (10+5)*2 | +--------+----------+ | 20 | 30 | +--------+----------+ 1 row in set (0.00 sec) mysql>

FUNCIONES
Si consideramos que MySQL es rico en lo que respecta a operadores, en lo que se refiere a funciones, podemos considerarlo millonario. MySQL dispone de multitud de funciones. Pero no las explicaremos aqu, ya que este curso incluye una referencia completa. Tan slo las agruparemos por tipos, e incluiremos los enlaces correspondientes a la documentacin de cada una.

FUNCIONES DE CONTROL DE FLUJO

Las funciones de esta categora son: IF IFNULL NULLIF Eleccin en funcin de una expresin booleana Eleccin en funcin de si el valor de una expresin es NULL Devuelve NULL en funcin del valor de una expresin

FUNCIONES MATEMTICAS
Las funciones de la categora de matemticas son:
ABS ACOS ASIN ATAN y ATAN2 CEILING y CEIL COS COT CRC32 DEGREES EXP FLOOR LN LOG LOG10 LOG2 MOD o % PI POW o POWER RADIANS RAND ROUND SIGN SIN SQRT TAN TRUNCATE Devuelve el valor absoluto Devuelve el arcocoseno Devuelve el arcoseno Devuelven el arcotangente Redondeo hacia arriba Coseno de un ngulo Cotangente de un ngulo Clculo de comprobacin de redundancia cclica Conversin de grados a radianes Clculo de potencias de e Redondeo hacia abajo Logaritmo natural Logaritmo en base arbitraria Logaritmo en base 10 Logaritmo en base dos Resto de una divisin entera Valor del nmero p Valor de potencias Conversin de radianes a grados Valores aleatorios Clculo de redondeos Devuelve el signo Clculo del seno de un ngulo Clculo de la raz cuadrada Clculo de la tangente de un ngulo Elimina decimales

FUNCIONES DE CADENAS
Las funciones para tratamiento de cadenas de caracteres son:
ASCII BIN BIT_LENGTH CHAR CHAR_LENGTH CHARACTER_LENGTH COMPRESS CONCAT CONCAT_WS CONV ELT EXPORT_SET FIELD FIND_IN_SET HEX INSERT INSTR LEFT LENGTH u OCTET_LENGTH LOAD_FILE LOCATE o POSITION LOWER o LCASE LPAD LTRIM MAKE_SET OCT ORD QUOTE REPEAT o Valor de cdigo ASCII de un carcter Converin a binario Clculo de longitud de cadena en bits Convierte de ASCII a carcter Clculo de longitud de cadena en caracteres Comprime una cadena de caracteres Concatena dos cadenas de caracteres Concatena cadenas con separadores Convierte nmeros entre distintas bases Eleccin entre varias cadenas Expresiones binarias como conjuntos Busca el ndice en listas de cadenas Bsqueda en listas de cadenas Conversin de nmeros a hexadecimal Inserta una cadena en otra Busca una cadena en otra Extraer parte izquierda de una cadena Calcula la longitud de una cadena en bytes Lee un fichero en una cadena Encontrar la posicin de una cadena dentro de otra Convierte una cadena a minsculas Aade caracteres a la izquierda de una cadena Elimina espacios a la izquierda de una cadena Crea un conjunto a partir de una expresin binaria Convierte un nmero a octal Obtiene el cdigo ASCII, incluso con caracteres multibyte Entrecomilla una cadena Construye una cadena como una repeticin de otra

REPLACE REVERSE RIGHT RPAD RTRIM SOUNDEX SOUNDS LIKE SPACE SUBSTRING o MID SUBSTRING_INDEX TRIM UCASE o UPPER UNCOMPRESS UNCOMPRESSED_LENGTH UNHEX

Busca una secuencia en una cadena y la sustituye por otra Invierte el orden de los caracteres de una cadena Devuelve la parte derecha de una cadena Inserta caracteres al final de una cadena Elimina caracteres blancos a la derecha de una cadena Devuelve la cadena "soundex" para una cadena concreta Compara cadenas segn su pronunciacin Devuelve cadenas consistentes en espacios Extraer subcadenas de una cadena Extraer subcadenas en funcin de delimitadores Elimina sufijos y/o prefijos de una cadena. Convierte una cadena a maysculas Descomprime una cadena comprimida mediante COMPRESS Calcula la longitud original de una cadena comprimida Convierte una cadena que representa un nmero hexadecimal a cadena de caracteres

FUNCIONES DE COMPARACIN DE CADENAS


Adems de los operadores que vimos para la comparacin de cadenas, existe una funcin: STRCMP Compara cadenas

FUNCIONES DE FECHA
Funciones para trabajar con fechas:
ADDDATE ADDTIME CONVERT_TZ CURDATE o CURRENTDATE CURTIME o CURRENT_TIME DATE DATEDIFF DATE_ADD Suma un intervalo de tiempo a una fecha Suma tiempos Convierte tiempos entre distintas zonas horarias Obtener la fecha actual Obtener la hora actual Extraer la parte correspondiente a la fecha Calcula la diferencia en das entre dos fechas Aritmtica de fechas, suma un intervalo de tiempo

DATE_SUB DATE_FORMAT DAY o DAYOFMONTH DAYNAME DAYOFWEEK DAYOFYEAR EXTRACT FROM_DAYS FROM_UNIXTIME GET_FORMAT HOUR LAST_DAY MAKEDATE MAKETIME MICROSECOND MINUTE MONTH MONTHNAME NOW o CURRENT_TIMESTAMP o LOCALTIME o LOCALTIMESTAMP o SYSDATE PERIOD_ADD PERIOD_DIFF QUARTER SECOND

Aritmtica de fechas, resta un intervalo de tiempo Formatea el valor de una fecha Obtiene el da del mes a partir de una fecha Devuelve el nombre del da de la semana Devuelve el ndice del da de la semana Devuelve el da del ao para una fecha Extrae parte de una fecha Obtener una fecha a partir de un nmero de das Representacin de fechas UNIX en formato de cadena Devuelve una cadena de formato Extrae la hora de un valor time Devuelve la fecha para el ltimo da del mes de una fecha Calcula una fecha a partir de un ao y un da del ao Calcula un valor de tiempo a partir de una hora, minuto y segundo Extrae los microsegundos de una expresin de fecha/hora o de Extrae el valor de minutos de una expresin time Devuelve el mes de una fecha Devuelve el nombre de un mes para una fecha Devuelve la fecha y hora actual

Aade meses a un periodo (ao/mes) Calcula la diferencia de meses entre dos periodos (ao/mes) Devuelve el cuarto del ao para una fecha Extrae el valor de segundos de una expresin time Convierte una cantidad de segundos a horas, minutos y segundos Obtiene un valor DATETIME a partir de una cadena con una fecha y una cadena de formato

SEC_TO_TIME STR_TO_DATE

SUBDATE SUBTIME TIME TIMEDIFF TIMESTAMP TIMESTAMPADD TIMESTAMPDIFF TIME_FORMAT TIME_TO_SEC TO_DAYS UNIX_TIMESTAMP UTC_DATE UTC_TIME UTC_TIMESTAMP WEEK WEEKDAY WEEKOFYEAR YEAR YEARWEEK

Resta un intervalo de tiempo de una fecha Resta dos expresiones time Extrae la parte de la hora de una expresin fecha/hora Devuelve en tiempo entre dos expresiones de tiempo Convierte una expresin de fecha en fecha/hora o suma un tiempo a una fecha Suma un intervalo de tiempo a una expresin de fecha/hora Devuelve la diferencia entre dos expresiones de fecha/hora Formatea un tiempo Convierte un tiempo a segundos Calcula el nmero de das desde el ao cero Devuelve un timestamp o una fecha en formato UNIX, segundos desde 1070 Devuelve la fecha UTC actual Devuelve la hora UTC actual Devuelve la fecha y hora UTC actual Calcula el nmero de semana para una fecha Devuelve el nmero de da de la semana para una fecha Devuelve el nmero de la semana del ao para una fecha Extrae el ao de una fecha Devuelve el ao y semana de una fecha

DE BSQUEDA DE TEXTO
Funcin de bsqueda de texto: MATCH

FUNCIONES DE CASTING (CONVERSIN DE TIPOS)


CAST o CONVERT Conversin de tipos explcita

FUNCIONES DE ENCRIPDADO
Funciones de encriptado de datos y de checksum:

AES_ENCRYPT AES_DECRYPT DECODE ENCODE DES_DECRYPT DES_ENCRYPT ENCRYPT

y Encriptar y desencriptar datos usando el algoritmo oficial AES Desencripta una cadena usando una contrasea Encripta una cadena usando una contrasea Desencripta usando el algoritmo Triple-DES Encripta usando el algoritmo Triple-DES Encripta str usando la llamada del sistema Unix crypt()

MD5 PASSWORD OLD_PASSWORD SHA o SHA1

Calcula un checksum MD5 de 128 bits para la cadena string u Calcula una cadena contrasea a partir de la cadena en texto plano Calcula un checksum SHA1 de 160 bits para una cadena

FUNCIONES DE INFORMACIN
Informacin sobre el sistema:
BENCHMARK CHARSET COERCIBILITY COLLATION Ejecuta una expresin varias veces Devuelve el conjunto de caracteres de una cadena Devuelve el valor de restriccin de coleccin de una cadena Devuelve la coleccin para el conjunto de caracteres de una cadena Devuelve el ID de una conexin Devuelve el nombre de usuario y el del host para la conexin actual Devuelve el nombre de la base de datos actual

CONNECTION_ID CURRENT_USER

DATABASE

FOUND_ROWS

Calcular cuntas filas se hubiesen obtenido en una sentencia SELECT sin la clusula LIMIT

LAST_INSERT_ID

Devuelve el ltimo valor generado automticamente para una columna AUTO_INCREMENT

USER o SESSION_USER Devuelve el nombre de usuario y host actual de MySQL o SYSTEM_USER VERSION Devuelve la versin del servidor MySQL

MISCELANEA
Funciones generales:
DEFAULT FORMAT GET_LOCK INET_ATON INET_NTOA IS_FREE_LOCK IS_USED_LOCK MASTER_POS_WAIT RELEASE_LOCK UUID Devuelve el valor por defecto para una columna Formatea el nmero segn la plantilla '#,###,###.## Intenta obtener un bloqueo con el nombre dado Obtiene el entero equivalente a la direccin de red dada en formato de cuarteto con puntos Obtiene la direccin en formato de cuarteto con puntos dado un entero Verifica si un nombre de bloqueo est libre Verifica si un nombre de bloqueo est en uso Espera hasta que el esclavo alcanza la posicin especificada en el diario maestro Libera un bloqueo Devuelve un identificador nico universal

DE GRUPOS
Funciones de grupos:
AVG BIT_AND BIT_OR BIT_XOR Devuelve el valor medio Devuelve la operacin de bits AND para todos los bits de una expresin Devuelve la operacin de bits OR para todos los bits de una expresin Devuelve la operacin de bits XOR para todos los bits de una expresin

COUNT

Devuelve el nmero de valores distintos de NULL en las filas recuperadas por una sentencia SELECT

COUNT DISTINCT Devuelve el nmero de valores diferentes, distintos de NULL GROUP_CONCA T MIN MAX STD o STDDEV SUM VARIANCE Devuelve una cadena con la concatenacin de los valores de un grupo Devuelve el valor mnimo de una expresin Devuelve el valor mximo de una expresin Devuelve la desviacin estndar de una expresin Devuelve la suma de una expresin Devuelve la varianza estndar de una expresin

CONSULTAS MULTITABLA
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 que an no hemos visto: el producto cartesiano y la composicin.

PRODUCTO CARTESIANO
Usaremos el ejemplo de las tablas de personas2 y telefonos2 del captulo 7, e insertaremos algunos datos:

mysql> INSERT INTO personas2 (nombre, fecha) VALUES -> ("camila", "1956-12-14"), -> ("Mariana", "1975-10-15"), -> ("Tatiana", "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 | camila | 1956-12-14 |

| 2 | Mariana | 1975-10-15 | | 3 | Tatiana | 1985-03-17 | | 4 | Fusganita | 1976-08-25 | +----+-----------+------------+ 4 rows in set (0.00 sec) mysql>
Ahora insertaremos datos en la tabla de telefonos2:

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) mysql>
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 | Pablo | 1956-12-14 | 123456789 | 1 | | 2 | Maria | 1975-10-15 | 123456789 | 1 | | 3 | Tatiana | 1985-03-17 | 123456789 | 1 |

| 4 | Fusganita | 1976-08-25 | 123456789 | 1 | | 1 | Pablo | 1956-12-14 | 145654854 | 1 | | 2 | Maria | 1975-10-15 | 145654854 | 1 | | 3 | Tatiana | 1985-03-17 | 145654854 | 1 | | 4 | Fusganita | 1976-08-25 | 145654854 | 1 | | 1 | Pablo | 1956-12-14 | 152452545 | 1 | | 2 | Maria | 1975-10-15 | 152452545 | 1 | | 3 | Tatiana | 1985-03-17 | 152452545 | 1 | | 4 | Fusganita | 1976-08-25 | 152452545 | 1 | | 1 | Pablo | 1956-12-14 | 254254254 | 2 | | 2 | Maria | 1975-10-15 | 254254254 | 2 | | 3 | Tatiana | 1985-03-17 | 254254254 | 2 | | 4 | Fusganita | 1976-08-25 | 254254254 | 2 | | 1 | Pablo | 1956-12-14 | 456545654 | 4 | | 2 | Maria | 1975-10-15 | 456545654 | 4 | | 3 | Tatiana | 1985-03-17 | 456545654 | 4 | | 4 | Fusganita | 1976-08-25 | 456545654 | 4 | | 1 | Pablo | 1956-12-14 | 441415414 | 4 | | 2 | Maria | 1975-10-15 | 441415414 | 4 | | 3 | Tatiana | 1985-03-17 | 441415414 | 4 | | 4 | Fusganita | 1976-08-25 | 441415414 | 4 | +----+-----------+------------+-----------+----+ 24 rows in set (0.73 sec) mysql>
Como se ve, la salida consiste en todas las combinaciones de todas las tuplas de ambas tablas.

COMPOSICIN (JOIN)
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.

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 Tuzla 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: 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:

mysql> SELECT * FROM personas2, telefonos2 -> WHERE personas2.id=telefonos2.id; +----+-----------+------------+-----------+----+ | id | nombre | fecha | numero | id | +----+-----------+------------+-----------+----+ | 1 | Pablo | 1956-12-14 | 123456789 | 1 | | 1 | Pablo | 1956-12-14 | 145654854 | 1 | | 1 | Pablo | 1956-12-14 | 152452545 | 1 | | 2 | Maria | 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) mysql>
Esta consulta es equivalente a estas otras:

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

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 | Pablo | 1956-12-14 | 123456789 | | 1 | Pablo | 1956-12-14 | 145654854 | | 1 | Pablo | 1956-12-14 | 152452545 | | 2 | Maria | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 | +----+-----------+------------+-----------+ 6 rows in set (0.00 sec) mysql>
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:

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 | Pablo | 1956-12-14 | 123456789 | | 1 | Pablo | 1956-12-14 | 145654854 | | 1 | Pablo | 1956-12-14 | 152452545 | | 2 | Maria | 1975-10-15 | 254254254 | | 4 | Fusganita | 1976-08-25 | 456545654 | | 4 | Fusganita | 1976-08-25 | 441415414 | +----+-----------+------------+-----------+ 6 rows in set (0.02 sec) mysql>

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. Como norma general se usa un ndice para localizar las tuplas de la segunda tabla que cumplen la condicin, y para cada Tuzla encontrada se aade una fila a la tabla de salida. Si no existe ninguna Tuzla en la segunda tabla que cumpla las condiciones, se combina la Tuzla de la primera con una nula de la segunda. En nuestro ejemplo se tomara la primera Tuzla 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 Tuzla, con id igual a 2. En la tercera el id es 3, y no existe ninguna Tuzla 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 | Pablo | 1956-12-14 | 123456789 | 1 | | 1 | Pablo | 1956-12-14 | 145654854 | 1 | | 1 | Pablo | 1956-12-14 | 152452545 | 1 | | 2 | Maria | 1975-10-15 | 254254254 | 2 | | 3 | Tatiana | 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) mysql>
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 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) 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)

mysql>
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 mysql>
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) mysql>
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) mysql>

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) mysql>
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


Por supuesto, tambin podemos hacer composiciones 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: externas naturales:

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) mysql>

TALLER
1. Hallar los articulos cuyo precio es superior a 50000 y estan compuestos por ms de un material. a) Para hallar los articulos cuyo precio son mayores de 50000 necesitamos mirar las tablas articulo ciuyo esta compuesta por cod_articulo, la otra tabla es compuesto por y tambien incluye el campo cod_articulo. b) Utilizamos SELECT para seleccionar las tablas que vamos a utilizar y los campos. c) El From es para especificar de donde son los campos que son artculo y compuestos_por. d) El WHERE es para realizar la operacin como tal del ejercicio entonce decimos que de la tabla articulos me escoja el que tenga el precio superior a 50000 pero que me mire la cantidad de material por el cual esta compuesto desde el acampo cod_producto. e) GROUP BY me sirve para agrupar las dos tablas y me las organice con la el articulo que esta compuesto por mas de un material. SELECT articul.cod_articulo, count (compuestos_por.cod_articulo) FROM articulo, compuesto_por WHERE precio > 50000 and articulo cod_articulo= compuesto_por.cod_articulo GROUP BY cod_articulo HAVING COUNT (compuesto_por.cod_articulo) >1 Ejemplo con INNER JOIN La sintaxis es: FROM - Tabla1 INNER JOIN Tabla2 ON Tabla1.col1 comp Tabla.col2 Ejemplo: SELECT FROM pedidos INNER JOIN clientes ON pedidos.cli = clientes.numclie Tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no nombre de consulta gusrdada), de las tablas cuyos registros se van a combinar: Puieden ser las dos de la misma tabla, en este caso es obligatorio definir al menos un alias de tabla. Col1, col2 son las columnas de eparejamiento

Observar que dentro de la clausula ON los nombres de columna deben ser monbres cualificados (llevan delante el nombre de la tabla y un punto) Como respresenta cualquier operador de compraracion (=, >,<, <=,>=, o, <>) y se utiliza para establecer la condicion de emparejamiento. Se puede definir varias condiciones de emparejameinto unidas por los operadores AND y OR poniendo cada condicion entre parentesisi. Ejemplo: SELECT FROM pedidios INNER JOIN productos NON (pedidos.fab = productos.idfab9AND (pedidos.producto = productos.idproducto) Se puede combinar mas de dos tablas en este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo. Por ejemplo: SELECT FROM (pedidos INNER JOIN cliente ON pedidos.clie = clientes.numclie) INNER JOIN empleados ON pedidoas.rep = empleados.numemp En vez de tabla1 hemos escrito un INNER JOIN completo, tambien podemos escribir: SELECT FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pediso.rep = empleados.numemp) ON pedidos.clie = clients.numclie En este caso hemos sustituido tabla2 por INNER JOIN complete. Ejemplo con producto cartesiano SELECT empleados.*, cuidad FORM empleados, oficinas WHERE empleados.oficinas = oficinas.oficina Ejemplo con INNER JOIN SELECT empleadsos.*, cuidad FROM empleadsos INNER JOIN oficinas ON empleados.oficinas = oficinas.oficina

Ejercicio1. Listar las oficinas del este indicando para cada una de ellas su numero, ciudad, y nombres de sus empleados. Rta: SELECT oficinas.oficina, ciudad, numeemp, nombre FROM oficinas INNER JOIN empleados ON oficinas.oficina = empleados.oficina WHERE region = este Ejemplo2: lsitas los pedidos mostrando su numero, importe, nombre del cliente, y el limite de credito del cliente correspondiente (todos los pedidos tienen cliente y representante) Rta: SELECT numpedido, importe, cliente.nombre AS cliente, limitecredito. FROM pedidos INNERJOIN cliente ON pedidos.clie = cliente.numclie

GUIA DE TRABAJO TALLER 1.


1. Hacer unas bases de datos donde este formda por las tablas de porveedore, artculos, inventarios, material y las dems que usted crea que son necesarias para realizar los siguientes consultas y ejercicios. 2. Realizar varias consultas donde se aplique los predicados DISTINC, DISTRINCTROW. 3. realizar dos ejemplos utilizando el ALIAS (AS) 4. listar los proveedores ordenados por nombres en forma Ascendente. 5. listar los proveedores ordenados por ciudad en forma Descendente. 6. Listas todos los campos de las tablas artculos, inventarios (que observa) 7. Listar los campos nombre, direccin de la tabla proveedores mas los campos cdigo material, descripcin de la tabla material (producto cartesiano) 8. Hallar nombre, direccio, ciudad, material de los proveedores que suministran el material 51001. 9. Hallar cdigos y descripciones de los artculos compuestos por al menos un material provisto por el proveedor intercontinental. 10. Hallar el nmero de almacenes que tiene todos los artculos que incluyen el material con cdigo 51001.

EJERCICO 2.
Construya las siguientes tablas: SEDE (cod_sede, nombre, cod_curso) CURSO (cod_curso, nombre, cod_sede, tot_estudiantes) MATERIA (cod_materia, nom_materia, cod_curso, ciclo) PROFESOR (cod_profesor, nom_profesor, fecha_naci, tipo, categoria) AULA (cod_aula, bloque, piso, caracteristicas) HORARIOS (cod_horario, dia, hora_ini, hora_fin) PROGRAMACION (cod_programa, cod_materia, cod_horario, cod_aula, fecha) Con las tablas anteriormente cradas realizar las siguientes consultas: 1. Hallar el numero de materias que se dictan En el curso de tcnicos en sistemas para III ciclo 2. Listar las materias, que dictan el dia 20/02/2009 del curso de Operadores de sistemas 3. Listar los nombres de la materia, nombre del curso de las materias que se dictan en el aula con cdigo 03 4. Listar cdigo del curso, nombre del curso que pertenece a la sede de Venecia ordenado Ascendentemente por nombres del curso

PHP

MDULO DE FORMACIN N 5

PROGRAMACIN III PROGRAMACIN WEB-

DURACIN MXIMA

150 HORAS Acompaamiento directo Trabajo independiente Prcticas Crditos Acadmicos

60 HORAS 15 HORAS 75 HORAS 3

MDULO DE FORMACIN N 5

PROGRAMACIN III PROGRAMACIN WEB-

DURACIN MXIMA

75 HORAS Acompaamiento directo Trabajo independiente Prcticas

30 HORAS 8 HORAS 37 HORAS

1. COMPETENCIAS A DESARROLLAR Elemento de competencia 01: COMPETENCIA ESPECFICA Construir el software para el sistema de informacin de acuerdo con la metodologa de Competencia: (220501007) desarrollo seleccionada. Desarrollar el sistema de informacin que cumpla con los requerimientos de Elemento de competencia 02: Probar el software desarrollado de acuerdo la solucin informtica. con las especificaciones establecidas en el diseo.

2. RESULTADOS (LOGROS) DE APRENDIZAJE 4. Maneja la interfaz de programacin de PHP, formularios, propiedades y controles bsicos. 5. Maneja las estructuras bsicas del lenguaje (definicin de variables, condicionales, ciclos repetitivos, funciones y procedimientos) 6. Identifica y programa eventos asociados a controles. 7. Desarrolla ejercicios utilizando programacin orientada a objetos. 8. Maneja los conceptos bsicos de Bases de Datos y los aplica en el diseo apropiado del modelo relacional (Diagrama entidad relacin). 9. Implementa el modelo de bases de datos relacional en MySQL server. 10. Gestiona bases de datos aplicando sentencias Sql.

3. CONTENIDOS 3.1 DE CONCEPTOS Y PRINCIPIOS (SABER) Conceptos bsicos sobre tipos de variables y variables tipo string Estructuras condicional (if), Estructuras repetitivas (for - while - do/while) Envo de datos de un FORMULARIO (controles text y submit) FORMULARIO (control radio) FORMULARIO (control checkbox) FORMULARIO (control select) FORMULARIO (control textarea) Creacin de un archivo de texto. Lectura de un archivo de texto. Funciones en PHP Base de datos (MySQL) INSERT (Alta de registros en una tabla) Listado (seleccin de registros de una tabla) Consulta (seleccin de registros de una tabla) DELETE (Baja de un registro en una tabla) DELETE (Baja de todos los registros de una tabla) UPDATE (Modificacin de un registro de una tabla) INSERT (y consulta de otra tabla) Listado (seleccin de registros de varias tablas - INNER JOIN) Funcin count de SQL. UPDATE (Modificacin de un registro trabajando con dos tablas) Clusula Group By de SQL Parmetros en un hipervnculo. Paginacin de registros. Creacin y lectura de una cookie Borrado de una cookie Redireccionar a otra pgina (header) Creacin de imgenes dinmicas desde PHP Agregar imgenes dinmicas en un archivo HTML Administracin de fechas y horas (funcin date) Validacin de una fecha ingresada por teclado (checkdate) Carga de una fecha en una tabla de MySQL Formateo de datos en una pgina (printf) 3.2 DE PROCESOS (SABER HACER) Aplicar el conocimiento conceptual en la programacin dirigida a eventos. Crear el entorno grfico adecuado para la alimentacin de la base de datos desde una pagina web Agregar objetos bsicos como textarea, control checkbox, control radio, etc. En un formulario. Crear la programacin adecuada que permita que el formulario mostrado en una

pagina web cumpla con el fin propuesto y que el usuario maneje la informacin de manera adecuada. Modificar los controles bsicos de un formulario. Aplicar de manera adecuada los conceptos en la programacin basada en MySQL. Programar los procesos necesarios, que permitan el funcionamiento adecuado de la aplicacin en el servidor establecido para ello. Programar cada uno de los elementos u objetos que conforman una buena aplicacin en la web. Identificar y aplicar la sentencia de control adecuada dependiendo de las necesidades de la aplicacin. Utilizar de manera acertada las diferentes funciones incorporadas, permitiendo mayor eficiencia en la programacin. Programar aplicaciones web aplicando estructuras bsicas. Reconocer el propsito de la base de datos. Determinar y construir de manera eficiente las tablas requeridas para almacenar la informacin. Relacionar apropiadamente mediante MySQL cada una de las tablas existentes que conforman una base de datos. Realizar el seguimiento y simulacin adecuada al diseo de la base de datos, permitiendo detectar errores y corregir antes de implementar. Construir aplicaciones fciles y optimas que se puedan trabajar de la web

3.3 ACTITUDINAL ( SER) Receptivo con el conocimiento adquirido. Eficiente en las labores a realizar. Respetuoso con las normas tcnicas impuestas. Organizado y ordenado con la informacin que se esta analizando y procesando. Responsable con el manejo de la informacin suministrada Oportuno y veraz en la entrega de la informacin. Confidente en el manejo y administracin de la informacin. Ordenado durante la realizacin y presentacin de los trabajos. Responsable y cuidadoso con los equipos a su cargo. Organizado y eficiente en clasificar la informacin que se utilizara en la solucin a los casos planteados. Respeta las normas establecidas para el desarrollo de los procesos. Lgico, critico y objetivo para generar aplicaciones de programas Respeta las normas de seguridad establecidas dentro de la Institucin. Apto para trabajar en equipo y aportar ideas para la solucin de problemas empresariales. Observador y autocritico, permitiendo de esta manera mejorar la aplicacin.

Ordenado y organizado al realizar los procesos de creacin de una conexin. Organizado con la informacin. Lgico y recursivo al momento de disear el entorno grfico de usuario. Respetuoso con las necesidades del usuario final y saber escuchar sus inquietudes y sugerencias.

4. CRITERIOS DE EVALUACION El diseo del entorno grfico no es ambiguo. El diseo brinda las ayudas requeridas, permitiendo el manejo adecuado de la aplicacin. Cada proceso que se realizo para el diseo se hizo en orden y de manera adecuada y precisa. La informacin es manipulada de manera adecuada y fcil. Se disean y programan paginas bsicas para dar solucin a casos cotidianos de manera coherente y ptima. Los objetos y las variables que se utilizan para la programacin de las paginas son los apropiados y requeridos en las soluciones planteadas. Se utilizan las funciones y procedimientos exigidos por la programacin de manera eficaz y optima. Apropia los conceptos para utilizarlos en el diseo de aplicaciones de Bases de datos. Identifica las diferencias entre cada uno de los conceptos vistos y los utiliza eficazmente. Conoce la definicin de los conceptos bsicos de tablas y Bases de datos. Disea las tablas empleando los requisitos exigidos. La implementacin de la base de datos en MySQL rene las condiciones tcnicas necesarias y cumple con los objetivos y propsitos planteados. Conoce y aplica adecuadamente las sentencias bsicas de MyQLS El diseo de la base de datos y su implementacin en el entorno web cumplen con los requerimientos tcnicos y con las exigencias del usuario final. El usuario final ingresa de manera adecuada a la aplicacin y realiza diferentes procesos de gestin con los datos contenidos en ella. 5. TCNICAS E INSTRUMENTOS DE EVALUACIN Algunas de las formas sugeridas de obtencin de las evidencias son: TCNICAS Observacin sistmica y formulacin de preguntas, estudio de casos, modificar diferentes scripts para ver su comportamiento o resultado. INSTRUMENTOS Fichas de observacin, cuestionario, talleres prcticos, lista de chequeo, informe escrito, observacin y anlisis de diferente aplicaciones desarrolladas en la web.

6. ESTRATEGIAS METODOLGICAS El formador utilizando un estudio de casos, explica paso a paso el desarrollo ideal de un proyecto o aplicacin de base de datos ubicado en un servidor, y luego gestiona la informacin contenida en ella para demostrar las bondades de dicha herramienta. El estudiante basndose en el ejemplo anterior desarrolla e implementa su propio proyecto procurando respetar los conceptos tcnicos aprendidos y verificando el adecuado funcionamiento del mismo. 7. MEDIOS DIDCTICOS Y RECURSOS EDUCATIVOS Laboratorios de sistemas, computadores, software, modulo gua, presentacin en power point referente al tema especifico, Internet, talleres, tablero, marcadores. 8. ESCENARIOS DE APRENDIZAJE Aula taller de clases, sala de audiovisuales, laboratorios de sistemas, consultas externas, entorno laboral y social. 9. PRERREQUISITO Poseer las competencias especficas del mdulo programacin II 10. PERFIL DEL FORMADOR Requisitos Acadmicos: Poseer ttulo a nivel tecnolgico o profesional en Ingeniera de sistemas. Experiencia laboral: Tener experiencia en el rea. Competencias: Tecnlogo o Profesional en Sistemas, con experiencia en el manejo de la tecnologa informtica. Estar certificado en las normas de competencias para docentes o tener experiencia docente en el rea de por lo menos 1 ao.

PHP
INTRODUCCION LOGROS DE APRENDIZAJE
1. Maneja la interfaz de programacin de PHP, formularios, propiedades y controles bsicos. 2. Maneja las estructuras bsicas del lenguaje (definicin de variables, condicionales, ciclos repetitivos, funciones y procedimientos) 3. Identifica y programa eventos asociados a controles. 4. Desarrolla ejercicios utilizando programacin orientada a objetos. 5. Maneja los conceptos bsicos de Bases de Datos y los aplica en el diseo apropiado del modelo relacional (Diagrama entidad relacin). 6. Implementa el modelo de bases de datos relacional en MySQL server. 7. Gestiona bases de datos aplicando sentencias Sql.
LOGROS POR COMPETENCIA

1. Desarrollar el sistema de informacin que cumpla con los requerimientos de la solucin informtica.

PHP es un acrnimo que significa PHP Hypertext Pre-processor (inicialmente PHP Tools, o, Personal Home Page Tools). Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la implementacin principal de PHP es producida ahora por The PHP Group. Publicado bajo la PHP License, la Free Software Foundation considera esta licencia como software libre.

PHP es un lenguaje interpretado de propsito general ampliamente usado y que est diseado especialmente para desarrollo web y puede ser incrustado dentro de cdigo HTML. Generalmente se ejecuta en un servidor web, tomando el cdigo en PHP como su entrada y creando pginas web como salida. Puede ser desplegado en la mayora de los servidores web y en casi todos los sistemas operativos y plataformas sin costo alguno. PHP se encuentra instalado en ms de 20 millones de sitios web y en un milln de servidores, aunque el nmero de sitios en PHP ha compartido algo de su preponderante sitio con otros nuevos lenguajes no tan poderosos desde agosto de 2005.Es tambin el mdulo Apache ms popular entre las computadoras que utilizan Apache como servidor web. La ms reciente versin principal del PHP fue la versin 5.2.8 del 08 de diciembre de 2008.

VISION GENERAL
El gran parecido que posee PHP con los lenguajes ms comunes de programacin estructurada, como C y Perl, permiten a la mayora de los programadores crear aplicaciones complejas con una curva de aprendizaje muy corta. Tambin les permite involucrarse con aplicaciones de contenido dinmico sin tener que aprender todo un nuevo grupo de funciones. Aunque todo en su diseo est orientado a facilitar la creacin de pgina web, es posible crear aplicaciones con una interfaz grfica para el usuario, utilizando la extensin PHP-Qt o PHP-GTK. Tambin puede ser usado desde la lnea de rdenes, de la misma manera como Perl o Python pueden hacerlo, a esta versin de PHP se la llama PHP CLI (Command Line Interface). Cuando el cliente hace una peticin al servidor para que le enve una pgina web, el servidor ejecuta el intrprete de PHP. ste procesa el script solicitado que generar el contenido de manera dinmica (por ejemplo obteniendo informacin de una base de datos). El resultado es enviado por el intrprete al servidor, quien a su vez se lo enva al cliente. Mediante extensiones es tambin posible la generacin de archivos PDF, Flash, as como imgenes en diferentes formatos. Permite la conexin a diferentes tipos de servidores de bases de datos tales como MySQL, Postgres, Oracle, ODBC, DB2, Microsoft SQL Server, Firebird y SQLite. PHP tambin tiene la capacidad de ser ejecutado en la mayora de los sistemas operativos, tales como UNIX (y de ese tipo, como Linux o Mac OS X) y Windows, y puede interactuar con los servidores de web ms populares ya que existe en versin CGI, mdulo para Apache, e ISAPI. PHP es una alternativa a las tecnologas de Microsoft ASP y ASP.NET (que utiliza C# VB.NET como lenguajes), a ColdFusion de la compaa Adobe (antes Macromedia), a

JSP/Java de Sun Microsystems, y a CGI/Perl. Aunque su creacin y desarrollo se da en el mbito de los sistemas libres, bajo la licencia GNU, existe adems un IDE (entorno de desarrollo integrado) comercial llamado Zend Studio. Recientemente, CodeGear (la divisin de lenguajes de programacin de Borland) ha sacado al mercado un entorno integrado de desarrollo para PHP, denominado Delphi for PHP. Existe un mdulo para Eclipse, uno de los IDE ms populares.

HISTORIA
Fue originalmente diseado en Perl, en base a la escritura de un grupo de CGI binarios escritos en el lenguaje C por el programador dans-canadiense Rasmus Lerdorf en el ao 1994 para mostrar su currculum vitae y guardar ciertos datos, como la cantidad de trfico que su pgina web reciba. El 8 de junio de 1995 fue publicado "Personal Home Page Tools" despus de que Lerdorf lo combinara con su propio Form Interpreter para crear PHP/FI.

PHP 3
Dos programadores israeles del Technion, Zeev Suraski y Andi Gutmans, reescribieron el analizador sintctico (parser en ingls) en el ao 1997 y crearon la base del PHP3, cambiando el nombre del lenguaje a la forma actual. Inmediatamente comenzaron experimentaciones pblicas de PHP3 y fue publicado oficialmente en junio del 1998. Para 1999, Suraski y Gutmans reescribieron el cdigo de PHP, produciendo lo que hoy se conoce como Zend Engine o motor Zend, un portmanteau de los nombres de ambos, Zeev y Andi. Tambin fundaron Zend Technologies en Ramat Gan, Israel.

PHP 4
En mayo de 2000 PHP 4 fue lanzado bajo el poder del motor Zend Engine 1.0. El da 13 de julio de 2007 se anunci la suspensin del soporte y desarrollo de la versin 4 de PHP,1 a pesar de lo anunciado se ha liberado una nueva versin con mejoras de seguridad, la 4.4.8 publicada el 13 de enero del 2008 y posteriormente la versin 4.4.9 publicada el 7 de agosto de 2008.

PHP 5
El 13 de julio de 2004, fue lanzado PHP 5, utilizando el motor Zend Engine 2.0 (o Zend Engine 2). La versin ms reciente de PHP es la 5.2.8 (8 de diciembre de 2008), que incluye todas las ventajas que provee el nuevo Zend Engine 2 como: Mejor soporte para la Programacin Orientada a Objetos, que en versiones anteriores era extremadamente rudimentario, con PHP Data Objects. Mejoras de rendimiento. Mejor soporte para MySQL con extensin completamente reescrita. Mejor soporte a XML ( XPath, DOM, etc. ).

Soporte nativo para SQLite. Soporte integrado para SOAP. Iteradores de datos. Manejo de excepciones.

PHP 6
Est previsto el lanzamiento en breve de la rama 6 de PHP. Cuando se lance esta nueva versin quedarn solo dos ramas activas en desarrollo (PHP 5 y 6), pues se abandon el desarrollo y soporte de PHP 4 el 13 de julio de 2007.
Versin PHP 1.0 Fecha 8 de junio de 1995 Cambios ms importantes Oficialmente llamado "Herramientas personales de trabajo (PHP Tools)". Es el primer uso del nombre "PHP". Considerado por el creador como la "ms rapida y simple herramienta" para la creacin de pginas webs dinmicas. Desarrollo movido de una persona a muchos desarrolladores. Zeev Suraski y Andi Gutmans reescriben la base para esta versin. Se aade un sistema ms avanzado de anlisis de etiquetas en dos fases anlisis/ejecucin llamado el motor Zend. Introducidas las variables superglobals ($_GET, $_SESSION, etc.). Se deshabilitan register_globals por defecto. Introducido la CLI, en adicin a la CGI.

PHP Version 16 de abril de 1996 2 (PHP/FI)

PHP 3.0

6 de junio de 1998

PHP 4.0

22 de mayo de 2000

PHP 4.1

10 de diciembre de 2001

PHP 4.2 PHP 4.3 PHP 4.4

22 de abril de 2002 27 de diciembre de 2002 11 de julio de 2005

PHP 5.0 PHP 5.1 PHP 5.2 PHP 5.2.4 PHP 5.2.5

13 de julio de 2004 25 de noviembre de 2005 2 de noviembre de 2006 30 de agosto de 2007 8 de noviembre de 2007

Motor Zend II con un nuevo modelo de objetos.

Habilitado el filtro de extensiones por defecto.

Versin centrada en mejorar la estabilidad (+60 errores solucionados).

PHP 5.2.8 PHP 5.2.9 PHP 6

8 de diciembre de 2008 26 de febrero de 2009 S/D Diversas mejoras en el mbito de la seguridad.

CARACTERSTICAS DE PHP
Ventajas Es un lenguaje multiplataforma. Capacidad de conexin con la mayora de los manejadores de base de datos que se utilizan en la actualidad, destaca su conectividad con MySQL. Capacidad de expandir su potencial utilizando la enorme cantidad de mdulos (llamados ext's o extensiones). Posee una amplia documentacin en su pgina oficial http://www.php.net/manual/es/), entre la cual se destaca que todas las funciones del sistema estn explicadas y ejemplificadas en un nico archivo de ayuda. Es libre, por lo que se presenta como una alternativa de fcil acceso para todos. Permite las tcnicas de Programacin Orientada a Objetos. Biblioteca nativa de funciones sumamente amplia e incluida. No requiere definicin de tipos de variables. Tiene manejo de excepciones (desde PHP5).

APLICACIONES DESARROLLADAS CON PHP


Burning Board

CMSformE Dokuwiki Drupal Facebook Gallery Project Mambo Open Source MediaWiki (desarrollado para Wikipedia) Moodle Phorum phpMyAdmin PHP-Nuke phpPgAdmin PhpWiki PmWiki Zikula (anteriormente llamado PostNuke) Smarty SPIP SugarCRM vBulletin WordPress Xaraya Xoops Joomla MODx SMF

TRABAJANDO CON PHP


Ya hemos explicado de modo terico lo que es PHP y sus bondades en la web ahora veamos, un ejemplo nos aclarar las cosas: Ejemplo1

Puede apreciarse que no es lo mismo que un script escrito en otro lenguaje de programacin como Perl o C -- En vez de escribir un programa con muchos comandos para crear una salida en HTML, escribimos el cdigo HTML con cierto cdigo PHP embebido (incluido) en el mismo, que producir cierta salida (en nuestro ejemplo, producir un texto). El cdigo PHP se incluye entre etiquetas especiales de comienzo y final que nos permitirn entrar y salir del modo PHP. Lo que distingue a PHP de la tecnologa Javascript, la cual se ejecuta en la mquina cliente, es que el cdigo PHP es ejecutado en el servidor. Si tuvisemos un script similar al de nuestro ejemplo en nuestro servidor, el cliente solamente recibira el resultado de su ejecucin en el servidor, sin ninguna posibilidad de determinar qu cdigo ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los archivos HTML con PHP. Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a su vez, ofrece muchas caractersticas avanzadas para los programadores profesionales. No sienta miedo de leer la larga lista de caractersticas de PHP, en poco tiempo podr empezar a escribir sus primeros scripts. Aunque el desarrollo de PHP est concentrado en la programacin de scripts en el lado del servidor, se puede utilizar para muchas otras cosas.

QU SE PUEDE HACER CON PHP?


PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la informacin de formularios, generar pginas con contenidos dinmicos, o enviar y recibir cookies. Y esto no es todo, se puede hacer mucho ms. Existen tres campos en los que se usan scripts escritos en PHP. Scripts del lado del servidor. Este es el campo ms tradicional y el principal foco de trabajo. Se necesitan tres cosas para que esto funcione. El intrprete PHP (CGI mdulo), un servidor web y un navegador. Es necesario correr el servidor web con PHP instalado. El resultado del programa PHP se puede obtener a travs del navegador, conectndose con el servidor web. Consultar la seccin Instrucciones de instalacin para ms informacin. Scripts en la lnea de comandos. Puede crear un script PHP y correrlo sin ningn servidor web o navegador. Solamente necesita el intrprete PHP para usarlo de esta manera. Este tipo de uso es ideal para scripts ejecutados regularmente desde cron (en *nix o Linux) o el Planificador de tareas (en Windows). Estos scripts tambin pueden ser usados para tareas simples de procesamiento de texto. Consultar la seccin Usos de PHP en la lnea de comandos para ms informacin

Escribir aplicaciones de interfaz grfica. Probablemente PHP no sea el lenguaje ms apropiado para escribir aplicaciones grficas, pero si conoce bien PHP, y quisiera utilizar algunas caractersticas avanzadas en programas clientes, puede utilizar PHP-GTK para escribir dichos programas. Tambin es posible escribir aplicaciones independientes de una plataforma. PHP-GTK es una extensin de PHP, no disponible en la distribucin principal. Si est interesado en PHP-GTK, puedes visitar las pginas web del proyecto. PHP puede ser utilizado en cualquiera de los principales sistemas operativos del mercado, incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft Windows, Mac OS X, RISC OS y probablemente alguno ms. PHP soporta la mayora de servidores web de hoy en da, incluyendo Apache, Microsoft Internet Information Server, Personal Web Server, Netscape e iPlanet, Oreilly Website Pro server, Caudium, Xitami, OmniHTTPd y muchos otros. PHP tiene mdulos disponibles para la mayora de los servidores, para aquellos otros que soporten el estndar CGI, PHP puede usarse como procesador CGI. De modo que, con PHP tiene la libertad de elegir el sistema operativo y el servidor de su gusto. Tambin tiene la posibilidad de usar programacin procedimental o programacin orientada a objetos. Aunque no todas las caractersticas estndar de la programacin orientada a objetos estn implementadas en la versin actual de PHP, muchas bibliotecas y aplicaciones grandes (incluyendo la biblioteca PEAR) estn escritas ntegramente usando programacin orientada a objetos. Con PHP no se encuentra limitado a resultados en HTML. Entre las habilidades de PHP se incluyen: creacin de imgenes, archivos PDF y pelculas Flash (usando libswf y Ming) sobre la marcha. Tambin puede presentar otros resultados, como XHTM y archivos XML. PHP puede autogenerar stos archivos y almacenarlos en el sistema de archivos en vez de presentarlos en la pantalla. Quizs la caracterstica ms potente y destacable de PHP es su soporte para una gran cantidad de bases de datos. Escribir un interfaz va web para una base de datos es una tarea simple con PHP. Las siguientes bases de datos estn soportadas actualmente:

Adabas D Ingres Oracle (OCI7 and OCI8) dBase InterBase Ovrimos Empress FrontBase PostgreSQL FilePro (readonly) mSQL Solid Hyperwave Direct MS-SQL Sybase IBM DB2 MySQL Velocis Informix ODBC Unix dbm

Tambin contamos con una extensin DBX de abstraccin de base de datos que permite usar de forma transparente cualquier base de datos soportada por la extensin. Adicionalmente, PHP soporta ODBC (el Estndar Abierto de Conexin con Bases de Datos), asi que puede conectarse a cualquier base de datos que soporte tal estndar. PHP tambin cuenta con soporte para comunicarse con otros servicios usando protocolos tales como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (en Windows) y muchos otros. Tambin se pueden crear sockets puros. PHP soporta WDDX para el intercambio de datos entre lenguajes de programacin en web. Y hablando de interconexin, PHP puede utilizar objetos Java de forma transparente como objetos PHP Y la extensin de CORBA puede ser utilizada para acceder a objetos remotos. PHP tiene unas caractersticas muy tiles para el procesamiento de texto, desde expresiones regulares POSIX extendidas o tipo Perl hasta procesadores de documentos XML. Para procesar y acceder a documentos XML, soportamos los estndares SAX y DOM. Puede utilizar la extensin XSLT para transformar documentos XML. Si usa PHP en el campo del comercio electrnico, encontrar muy tiles

las funciones Cybercash, CyberMUT, VeriSign Payflow Pro y CCVS para sus programas de pago. Para terminar, contamos con muchas otras extensiones muy interesantes, las funciones del motor de bsquedas mnoGoSearch, funciones para pasarelas de IRC, utilidades de compresin (gzip, bz2),, conversin de calendarios, traduccin . Como puede apreciar, toda esta informacion no es suficiente para enumerar todas las caractersticas y beneficios que PHP ofrece.

UNA EXPLICACIN SENCILLA


A continuacin, le introduciremos a PHP en un pequeo y sencillo manual. Este documento explica cmo crear pginas web dinmicas para Internet con PHP, aunque PHP no solamente est diseado para la creacin de stas. Las pginas web que utilizan PHP son tratadas como pginas de HTML comunes y corrientes, y pueden crearlas y editarlas de la misma manera que lo hace con documentos normales de HTML.

Qu necesito?
En este manual vamos a asumir que usted cuenta con un servidor que soporta PHP y que todos los archivos con la extensin .php son manejados por PHP. En la mayora de servidores, sta es la extensin que toman los archivos PHP por defecto, pero pregunte al administrador de su servidor para estar seguro. Si su servidor soporta PHP, entonces no necesita hacer nada, solamente crear sus archivos .php y guardarlos en su directorio web, y el servidor, como por arte de magia, los analizar para usted. No hay necesidad de compilar nada, tampoco tiene necesidad de instalar otras herramientas. Mrelo de esta manera, estos archivos de PHP son tan simples como archivos de HTML con una nueva familia de etiquetas que le permiten una gran cantidad de cosas. La mayora de las compaas de hospedaje de pginas web ofrecen el soporte que necesita para usar PHP. Digamos que usted tiene limitado acceso a internet y se encuentra programando localmente. En este caso, querr instalar un servidor de web como Apache, y PHP. Lo ms seguro es que tambin quiera instalar una base de datos como MySQL. Puede instalar estos productos individualmente o simplemente localizar un paquete pre-configurado que automticamente instale todos estos productos con solamente unos movimientos de su ratn. Es muy fcil instalar un servidor web con soporte para PHP en cualquier sistemas operativo, incluyendo Linux y Windows. En Linux, rpmfind y PBone le ayudarn a encontrar un RPM.

INSTALACION DE THE APPSERV OPEN PROJECT - 2.5.7 FOR WINDOWS. (2000/NT/2003/XP)


Esta herramienta es freeware, fue descargada de su sitio web y bsicamente trabaja con varias herramientas entre las cuales se destacan:

Apache Web Server Version 2.2.3 PHP Script Language Version 5.1.6 MySQL Database Version 5.0.24a phpMyAdmin Database Manager Version 2.9.0.2

Herramientas que utilizaremos para probar los ejemplos dados en este manual, y cargar los formularios PHP y vincularlos con MySQL en forma prctica, este software puede ser instalado como servidor web o servido de mbito local si no tenemos internet o un servidor Web. A continuacin debemos seguir los siguientes pasos para su instalacin. 1. Consigue el instalador de la aplicacin, este debe ser dado por el tutor o docente del curso, y ejectelo.

2. Aparecer el gestor de la instalacin como aparece en la siguiente imagen, has clic en siguiente.

3. Acepte los trminos de las condiciones de uso, haciendo clic en el botn I AGREE

4. Escoja la carpeta de instalacin, puede ser la que aparece en la figura o escriba una nueva ubicacin, y haz clic en NEXT>

5. Selecciona todos los componentes a instalar y haz clic en NEXT>.

6. Escribe la informacin que aparecer en la siguiente imagen, si vas a utilizar un servidor local, escribe localhost, de los contrario escribe www.(servidor).(com, org, ar etc), no borres el puerto 80, ya que es el puerto que habilita el HTTP, luego clic en NEXT>.

7. Escribe la contrasea del usuario, reescrbela y luego haz clic en INSTALL>

Se ejecutara la instalacin, luego puedes ejecutar los servicios, MySQL, Y Apache.

8. Una vez instalada la aplicacin, se creo la carpeta C:\AppServ, en su interior encontraras una carpeta llamada www, coloca all todos los archivos con los que vas a trabajar en este manual.

Para acceder a los servicios de APPSERV OPEN PROJECT - 2.5.7 FOR WINDOWS. (2000/NT/2003/XP), debes utilizar tu navegador web (internet explorer, mozilla firefox, opera, google chrome, entre otros) y en la barra de direcciones escribir lo que aparece en pantalla. http://localhost.

Si quieres probar una pagina con cdigo PHP, la guardas en la carpeta www y la llamas desde la barra de direcciones del explorador web. Por ejemplo visualicemos la pagina prueba.php almacenada all.

Para ejecutar la herramienta phpMyAdmin Database Manager Version 2.9.0.2, esta herramienta sirve para crear tus bases de datos en MySQL, deberas colocar el usuario root con la contrasea que usaste al instalar esta herramienta.

Se crea la base de datos y listo! A trabajar.

PRIMERA PGINA CON PHP


Comience por crear un archivo (puede hacerlo en el bloc de notas) llamado hola.php y colocarle en el "directorio raz" (DOCUMENT_ROOT) con el siguiente contenido: Ejemplo2 Nuestro primer script PHP: hola.php

Utilice su navegador web para acceder al archivo, con la URL terminando en "/hola.php". Si est programando localmente este URL lucir algo como http://localhost/hola.php o http://127.0.0.1/hola.php pero esto depende de la configuracin de su servidor web. Si todo est configurado correctamente, el archivo ser analizado por PHP y el siguiente contenido aparecer en su navegador:

HOLA MUNDO
Note que esto no es como los scripts de CGI. El archivo no necesita ninguna clase especial de permisos para ser ejecutado. Piense en ellos como si fueran archivos HTML con un conjunto muy especial de etiquetas disponibles, y que hacen muchas cosas interesantes. Este programa es extremadamente simple, y no necesita usar PHP para crear una pgina como sta. Todo lo que hace es mostrar: Hola Mundo usando la sentencia echo(). Si ha intentado usar este ejemplo, y no produjo ningn resultado, preguntando si deseaba descargar el archivo, o mostr todo el archivo como texto, lo ms seguro es que PHP no se encuentra habilitado en su servidor. El objetivo de este ejemplo es demostrar cmo puede usar las etiquetas PHP. En este ejemplo usamos <?php para indicar el inicio de la etiqueta PHP. Despus indicamos la sentencia y abandonamos el modo PHP usando?>. Puede salir de PHP y regresar cuantas veces lo desee usando este mtodo. Una nota acerca de editores de texto: Hay muchos editores de texto y Entornos Integrados de Desarrollo (IDE por sus siglas en Ingls) que puede usar para crear, editar, y organizar archivos PHP. Puede encontrar una lista parcial de stos en Lista de editores de PHP en su pagina principal (www.php.net). Si desea recomendar un editor, por favor visite la pgina mencionada anteriormente, y comunique su recomendacin a las personas encargadas del mantenimiento para que lo incluyan en la lista. Contar con un editor que resalte la sintaxis de PHP puede ser de mucha ayuda.

Una nota acerca de los procesadores de palabras: Los procesadores de palabras como "StarOffice", "Microsoft word" y "Abiword" no son buenas opciones para editar archivos de PHP. Si desea usar uno de stos programas para probar sus scripts, primero debe asegurarse de guardar el documento en formato de "Texto" puro, o PHP no ser capaz de ejecutar el script. Una nota acerca del "Bloc de Notas de Windows": Si desea escribir sus archivos PHP usando el "Bloc de Notas de Windows" o en algn otro editor de texto para Windows necesita asegurarse de que sus archivos sean guardados con la extensin .php (la mayora de editores de texto en Windows automticamente tratarn de aadir la extensin .txt a los archivos a menos que tome los siguientes pasos para prevenirlo).Cuando guarde sus archivos y el programa le pregunte qu nombre le desea dar al archivo, use comillas para indicar el nombre (es decir, "hola.php"). Una alternativa es, en la lista de opciones "Archivos de Texto *.txt", seleccionar la opcin "Todos los archivos *.*". Aqu puede escribir el nombre del archivo sin las comillas. Ahora que ha creado un pequeo script de PHP que funciona correctamente, es hora de trabajar con el script de PHP ms famoso; vamos a hacer una llamada a la funcin phpinfo() para obtener informacin acerca de su sistema y configuracin como las variables predefinidas disponibles, los mdulos utilizados por PHP, y las diferentes opciones de configuracin. Tomemos unos segundos para revisar esta informacin. Algo til Hagamos ahora algo que puede ser ms til. Vamos a chequear qu clase de navegador web utiliza. Para hacerlo, vamos a consultar la informacin que el navegador nos enva como parte de su peticin HTTP. Esta informacin es guardada en una variable. Las variables siempre comienzan con un signo de dlar ("$") en PHP. La variable que vamos a utilizar en esta situacin es $_SERVER ["HTTP_USER_AGENT"]. Nota: $_SERVER es una variable reservada por PHP que contiene toda la informacin del servidor web. Es conocida como Autoglobal (o Superglobal). Consulte el manual en su seccin titulada Autoglobales para mas informacin. stas son variables especiales que fueron introducidas en la versin 4.1.0 de PHP. Antes podamos usar las matrices $HTTP_*_VARS, tales como $HTTP_SERVER_VARS. Aunque stas han sido marcadas como obsoletas, tales matrices todava existen. (Tambin puede echar un vistazo a las notas relacionadas con el cdigo antiguo.) Para poder ver esta variable solo necesita:

Ejemplo 3. Impresin de una variable (elemento de la matriz) <?php echo $_SERVER["HTTP_USER_AGENT"]; ?> Un ejemplo de los resultados de este programa sera: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Hay muchos tipos de variables en PHP. En el ejemplo anterior imprimimos una matriz. Las matrices pueden ser muy tiles. $_SERVER es simplemente una variable que se encuentra disponible automticamente para usted en PHP. Puede encontrar una lista en la seccin titulada Variables Reservadas del manual, o puede generar una lista completa creando un archivo como el presentado a continuacin: Ejemplo 4. Consultar todas las variables predefinidas con phpinfo() <?php phpinfo(); ?> Si abre este archivo con su navegador, puede ver una pgina con informacin acerca de PHP, junto a una lista de todas las variables que puede usar. Puede usar ms de un declaracin PHP dentro de una etiqueta PHP, y crear pequeos segmentos de cdigo que pueden hacer ms que un "echo". Por ejemplo, si quisiramos detectar el uso de "Internet Explorer", haramos algo as: Ejemplo 5. Ejemplos de uso de estructuras de control y funciones

Un ejemplo de los resultados del script puede ser:

ESTA USANDO INTERNET EXPLORER


A continuacin introduciremos un par de conceptos nuevos. Tenemos una declaracin "if". Si est familiarizado con la sintaxis bsica del lenguaje "C", esto se vera lgico, Pero si no entiende "C", u otros lenguajes de programacin donde encuentra la sintaxis usada anteriormente, probablemente debera conseguir un libro que le introduzca mejor a PHP. sobre PHP en http://www.php.net/books.php.

El segundo concepto que introducimos fue la funcin llamada strstr(). strstr() es una funcin integrada de PHP que busca un cadena dentro de otra cadena ms larga. En el caso anterior estamos buscando "MSIE" dentro de $_SERVER["HTTP_USER_AGENT"]. Si la cadena fue encontrada, la funcin devolver verdadero ("TRUE"), la declaracin "if" se evala a verdadero ("TRUE") y el cdigo adentro de las llaves {} es ejecutado. De otra manera no resulta ejecutado. Tmese la libertad de crear ejemplos similares usando "if", "else" ("de otra manera"), y otras funciones como strtoupper() y strlen(). Cada pgina del manual contiene ejemplos que puede usar. Si no est seguro sobre el modo de uso stas funciones, es recomendable que lea las pginas del manual tituladas Cmo leer una definicin de funcin y la seccin relacionada a Funciones en PHP Podemos continuar y demostrar cmo puede saltar adentro y afuera del modo PHP en el medio de un bloque de cdigo. Ejemplo 6. Mezcla de los modos HTML y PHP

Un ejemplo de los resultados de este script puede ser: debe haber devuelto verdadero Est usando Internet Explorer En vez de usar una sentencia PHP "echo" para demostrar algo, saltamos fuera del cdigo PHP y escribimos HTML puro. Este es un punto muy importante y potente que debemos observar aqu, y es que la fluidez lgica del script est intacta. Slamente las partes donde hay HTML sern enviadas a su navegador dependiendo de los resultados que strstr() devuelve (si fue verdadero [TRUE], o falso [FALSE]). En otras palabras, si la cadena MSIE fue encontrada o no.

SINTAXIS BSICA
Saliendo de HTML Para interpretar un archivo, php simplemente interpreta el texto del archivo hasta que encuentra uno de los caracteres especiales que delimitan el inicio de cdigo PHP. El intrprete ejecuta entonces todo el cdigo que encuentra, hasta que encuentra una etiqueta de fin de cdigo, que le dice al intrprete que siga ignorando el cdigo siguiente. Este mecanismo permite embeber cdigo PHP dentro de HTML: todo lo que est fuera de las etiquetas PHP se deja tal como est, mientras que el resto se interpreta como cdigo. Hay cuatro conjuntos de etiquetas que pueden ser usadas para denotar bloques de cdigo PHP. De estas cuatro, slo 2 (<?php. . .?> y <script language="php">. . .</script>) estn siempre disponibles; el resto pueden ser configuradas en el fichero de php.ini para ser o no aceptadas por el intrprete. Mientras que el formato corto de etiquetas (short-form tags) y el estilo ASP (ASP-style tags) pueden ser convenientes, no son portables como la versin de formato largo de etiquetas. Adems, si se pretende embeber cdigo PHP en XML o XHTML, ser obligatorio el uso del formato <?php. . .?> para la compatibilidad con XML. Las etiquetas soportadas por PHP son: Ejemplo 7. Formas de escapar de HTML

El mtodo primero, <?php. . .?>, es el ms conveniente, ya que permite el uso de PHP en cdigo XML como XHTML. El mtodo segundo no siempre est disponible. El formato corto de etiquetas est disponible con la funcin short_tags() (slo PHP 3), activando el parmetro del fichero de configuracin de PHP short_open_tag, o compilando PHP con la opcin --enable-short-tags del comando configure. Aunque est activa por defecto en php.ini-dist, se desaconseja el uso del formato de etiquetas corto. El mtodo cuarto slo est disponible si se han activado las etiquetas ASP en el fichero de configuracin: asp_tags.

Nota: El soporte de etiquetas ASP se aadi en la versin 3.0.4. Nota: No se debe usar el formato corto de etiquetas cuando se desarrollen aplicaciones o bibliotecas con intencin de redistribuirlas, o cuando se desarrolle para servidores que no estn bajo nuestro control, porque puede ser que el formato corto de etiquetas no est soportado en el servidor. Para generar cdigo portable y redistribuble, asegrate de no usar el formato corto de etiquetas. La etiqueta de fin de bloque incluir tras ella la siguiente lnea si hay alguna presente. Adems, la etiqueta de fin de bloque lleva implcito el punto y coma; no necesitas por lo tanto aadir el punto y coma final de la ltima lnea del bloque PHP. PHP permite estructurar bloques como: Ejemplo 8. Mtodos avanzados de escape

Este ejemplo realiza lo esperado, ya que cuando PHP encuentra las etiquetas ?> de fin de bloque, empieza a escribir lo que encuentra tal cual hasta que encuentra otra etiqueta de inicio de bloque. El ejemplo anterior es, por supuesto, inventado. Para escribir bloques grandes de texto generalmente es ms eficiente sepralos del cdigo PHP que enviar todo el texto mediante las funciones echo(), print() o similares. Separacin de instrucciones La separacin de instrucciones se hace de la misma manera que en C o Perl - terminando cada declaracin con un punto y coma. La etiqueta de fin de bloque (?>) implica el fin de la declaracin, por lo tanto lo siguiente es equivalente:

Comentarios PHP soporta el estilo de comentarios de 'C', 'C++' y de la interfaz de comandos de Unix. Por ejemplo:

Los estilos de comentarios de una lnea actualmente slo comentan hasta el final de la lnea o el bloque actual de cdigo PHP, lo primero que ocurra.

Hay que tener cuidado con no anidar comentarios de estilo 'C', algo que puede ocurrir al comentar bloques largos de cdigo.

Los estilos de comentarios de una lnea actualmente slo comentan hasta el final de la linea o del bloque actual de cdigo PHP, lo primero que ocurra. Esto implica que el cdigo HTML tras // ?> ser impreso: ?> sale del modo PHP, retornando al modo HTML, el comentario // no le influye.

TIPOS DE DATOS
PHP soporta ocho tipos primitivos. Cuatro tipos escalares:

boolean integer float (nmero de punto-flotante, tambin conocido como 'double') string

Dos tipos compuestos: array object Y finalmente dos tipos especiales: resource NULL Este manual introduce tambin algunos pseudo-tipos por razones de legibilidad: mixed number callback Tambin puede encontrar algunas referencias al tipo "double". Considere al tipo double como el mismo que float, los dos nombres existen solo por razones histricas. El tipo de una variable usualmente no es declarado por el programador; en cambio, es decidido en tiempo de compilacin por PHP dependiendo del contexto en el que es usado la variable. Nota: Si desea chequear el tipo y valor de una cierta expresin, use var_dump(). Nota: Si tan solo desea una representacin legible para humanos del tipo para propsitos de depuracin, use gettype(). Para chequear por un cierto tipo, no use gettype(); en su lugar utilice las funciones is_tipo. Algunos ejemplos:

Si quisiera forzar la conversin de una variable a cierto tipo, puede moldear la variable, o usar la funcin settype() sobre ella. Note que una variable puede ser evaluada con valores diferentes en ciertas situaciones, dependiendo del tipo que posee en cada momento. Para ms informacin, vea la seccin sobre Manipulacin de Tipos. Asimismo, puede encontrarse interesado en consultar las tablas de comparacin de tipos, ya que stas muestran ejemplos de las varias comparaciones relacionadas con tipos.

Booleanos
Este es el tipo ms simple. Un boolean expresa un valor de verdad. Puede ser TRUE or FALSE. Nota: El tipo booleano fue introducido en PHP 4. Sintaxis Para especificar un literal booleano, use alguna de las palabras clave TRUE o FALSE. Ambas son insensibles a maysculas y minsculas.

Usualmente se usa algn tipo de operador que deuelve un valor boolean, y luego ste es pasado a una estructura de control.

Conversin a booleano
Para convertir explcitamente un valor a boolean, use el moldeamiento (bool) o (boolean). Sin embargo, en la mayora de casos no es necesario usar el moldeamiento, ya que un valor ser convertido automticamente si un operador, funcin o estructura de control requiere un argumento tipo boolean. Cuando se realizan conversiones a boolean, los siguientes valores son considerados FALSE: el boolean FALSE mismo el integer 0 (cero) el float 0.0 (cero) el valor string vaco, y el string "0" un array con cero elementos un object con cero variables miembro el tipo especial NULL (incluyendo variables no definidas)

Cualquier otro valor es considerado TRUE (incluyendo cualquier resource).

Enteros
Un integer es un nmero del conjunto Z = {..., -2, -1, 0, 1, 2, ...}. Vea tambin: Entero de longitud arbitraria / GMP, Nmeros de punto flotante, y Precisin arbitraria / BCMath. Sintaxis Los enteros pueden ser especificados en notacin decimal (base-10), hexadecimal (base16) u octal (base-8), opcionalmente precedidos por un signo (- o +). Si usa la notacin octal, debe preceder el nmero con un 0 (cero), para usar la notacin hexadecimal, preceda el nmero con 0x.

Ejemplo 10. Literales tipo entero

Formalmente, la posible estructura para literales enteros es:

El tamao de un entero es dependiente de la plataforma, aunque un valor mximo de aproximadamente dos billones es el valor usual (lo que es un valor de 32 bits con signo). PHP no soporta enteros sin signo.

Desbordamiento de enteros
Si especifica un nmero ms all de los lmites del tipo integer, ser interpretado en su lugar como un float. Asimismo, si realiza una operacin que resulta en un nmero ms all de los lmites del tipo integer, un float es retornado en su lugar.

No hay un operador de divisin de enteros en PHP. 1/2 produce el float 0.5. Puede moldear el valor a un entero para asegurarse de redondearlo hacia abajo, o puede usar la funcin round().

Conversin a entero
Para convertir explcitamente un valor a integer, use alguno de los moldeamientos (int) o (integer). Sin embargo, en la mayora de casos no necesita usar el moldeamiento, ya que un valor ser convertido automticamente si un operador, funcin o estructura de control requiere un argumento tipo integer. Tambin puede convertir un valor a entero con la funcin intval().

Desde booleans
FALSE producir 0 (cero), y TRUE producir 1 (uno). Desde nmeros de punto flotante Cuando se realizan conversiones desde un flotante a un entero, el nmero ser redondeado hacia cero. Si el flotante se encuentra ms all de los lmites del entero (usualmente +/- 2.15e+9 = 2^31), el resultado es indefinido, ya que el flotante no tiene suficiente precisin para dar un resultado entero exacto. No se producir una advertencia,

Nmeros de punto flotante


Los nmeros de punto flotante (tambin conocidos como "flotantes", "dobles" o "nmeros reales") pueden ser especificados usando cualquiera de las siguientes sintaxis:

Formalmente:

El tamao de un flotante depende de la plataforma, aunque un valor comn consiste en un mximo de ~1.8e308 con una precisin de aproximadamente 14 dgitos decimales (lo que es un valor de 64 bits en formato IEEE).

Precisin del punto flotante


Es bastante comn que algunas fracciones decimales simples como 0.1 o 0.7 no puedan ser convertidas a su representacin binaria interna sin perder un poco de precisin. Esto puede llevar a resultados confusos: por ejemplo, floor((0.1+0.7)*10) usualmente devolver 7 en lugar del esperado 8 ya que el resultado de la representacin interna es en realidad algo como 7.9999999999.... Esto se encuentra relacionado al hecho de que es imposible expresar de forma exacta algunas fracciones en notacin decimal con un nmero finito de dgitos. Por ejemplo, 1/3 en forma decimal se convierte en 0.3333333. As que nunca confe en resultados de nmeros flotantes hasta el ltimo dgito, y nunca compare nmeros de punto flotante para conocer si son alentes. Si realmente necesita una mejor precisin, es buena idea que use las funciones matemticas de precisin arbitraria o las funciones gmp en su lugar.

Conversin a flotante
Para ms informacin sobre cundo y cmo son convertidas las cadenas a flotantes, vea la seccin titulada Conversin de cadenas a nmeros. Para valores de otros tipos, la conversin es la misma que si el valor hubiese sido convertido a entero y luego a flotante. Vea la seccin Conversin a entero para ms informacin.

Cadenas
Un valor string es una serie de caracteres. En PHP, un caracter es lo mismo que un byte, es decir, hay exactamente 256 tipos de caracteres diferentes. Esto implica tambin que PHP no tiene soporte nativo de Unicode. Vea utf8_encode() y utf8_decode() para conocer sobre el soporte Unicode. Nota: El que una cadena se haga muy grande no es un problema. PHP no impone lmite prctico alguno sobre el tamao de las cadenas, as que no hay ninguna razn para preocuparse sobre las cadenas largas. Sintaxis Un literal de cadena puede especificarse en tres formas diferentes.

comillas simples comillas dobles sintaxis heredoc Comillas simples La forma ms simple de especificar una cadena sencilla es rodearla de comillas simples (el carcter'). Para especificar una comilla sencilla literal, necesita escaparla con una barra invertida (\), como en muchos otros lenguajes. Si una barra invertida necesita aparecer antes de una comilla sencilla o al final de la cadena, necesitar doblarla. Note que si intenta escapar cualquier otro caracter, la barra invertida ser impresa tambin! De modo que, por lo general, no hay necesidad de escapar la barra invertida misma. Nota: A diferencia de las otras dos sintaxis, las variables y secuencias de escape para caracteres especiales no sern expandidas cuando ocurren al interior de cadenas entre comillas sencillas.

Ejemplo 13. Comillas dobles

Si la cadena se encuentra rodeada de comillas dobles ("), PHP entiende ms secuencias de escape para caracteres especiales: Tabla 2. Caracteres escapados

Nuevamente, si intenta escapar cualquier otro carcter, la barra invertida ser impresa tambin! Pero la caracterstica ms importante de las cadenas entre comillas dobles es el hecho de que los nombres de variables sern expandidos. Vea procesamiento de cadenas para ms detalles. Heredoc Otra forma de delimitar cadenas es mediante el uso de la sintaxis heredoc ("<<<"). Debe indicarse un identificador despus de la secuencia <<<, luego la cadena, y luego el mismo identificador para cerrar la cita. El identificador de cierre debe comenzar en la primera columna de la lnea. Asimismo, el identificador usado debe seguir las mismas reglas que cualquier otra etiqueta en PHP: debe contener solo caracteres alfanumricos y de subrayado, y debe iniciar con un carcter no-dgito o de subrayado. Aviso Es muy importante notar que la lnea con el identificador de cierre no contenga otros caracteres, excepto quizs por un punto-y-coma (;). Esto quiere decir en especial que el identificador no debe usar sangra, y no debe haber espacios o tabuladores antes o despus del punto-y-coma. Es importante tambin notar que el primer caracter antes del

identificador de cierre debe ser un salto de lnea, tal y como lo defina su sistema operativo. Esto quiere decir \r en Macintosh, por ejemplo. Si esta regla es rota y el identificador de cierre no es "limpio", entonces no se considera un identificador de cierre y PHP continuar en busca de uno. Si, en tal caso, no se encuentra un identificador de cierre apropiado, entonces un error del analizador sintctico resultar con el nmero de lnea apuntando al final del script. El texto heredoc se comporta tal como una cadena entre comillas dobles, sin las comillas dobles. Esto quiere decir que no necesita escapar tales comillas en sus bloques heredoc, pero aun puede usar los cdigos de escape listados anteriormente. Las variables son expandidas, aunque debe tenerse el mismo cuidado cuando se expresen variables complejas al interior de un segmento heredoc, al igual que con otras cadenas. Ejemplo 12. Ejemplo de uso de una cadena heredoc

ESTRUCTURA CONDICIONAL (IF) EN PHP


La condicin if nos permite evaluar y tomar una decisin segn el resultado del test. Su sintaxis es:

if (condicin) { cdigo a ejecutar si condicin es Verdadera } else { cdigo a ejecutar si condicin es Falsa }
Ejercicio prctico #1

Crearemos un formulario HTML con dos botones de opcin (radio), una caja y un botn de Enviar (submit). Ejemplo1 pero con radiobuttons

El cdigo del formulario sera: <form action="valorar2.php" method="post"> Tratamiento <input type="radio" name="trato" value="h" /> Sr. <input type="radio" name="trato" value="m /> Sra. <br /> Su Apellido: <input type="text" name="apellido" /> <input type="submit" value="Enviar" /> </form> Ahora creamos la pagina valorar2.php: <?php if ($trato=="h") { echo "Hola Seor $apellido";} else { echo "Hola Seora $apellido";} ?> El resultado seria:

ESTRUCTURAS REPETITIVAS EN PHP


Las estructuras repetitivas, ms ampliamente conocidas como "bucles", se utilizan para ejecutar un bloque de cdigo de forma repetida mientras (o hasta) que se cumpla una determinada condicin. Los usos habituales de los bucles dentro de un script son como contadores o para implementar sumatorias, tambin se utilizan para recorrer objetos u estructuras compuestas por ms de un elemento, como ocurre con los arreglos. Las estructuras repetitivas con las que cuenta PHP son: Bucle for Bucle while Bucle do . . . while Bucle foreach

Bucle for
La sentencia for permite repetir un conjunto de instrucciones un determinado nmero de veces. Es necesario conocer anticipadamente el nmero de iteraciones. Su sintaxis es: for ($contador = inicio; condicin; incremento/decremento) { sentencias_a_repetirse; } La variable $contador es inicializada con el valor de inicio y se incrementa o decrementa hasta que se cumpla la condicin. Mientras esta condicin sea cierta, se ejecutan las sentencias_a_repetirse. La condicin se evala antes de cada iteracin. La expresin incremento/decremento define la manera en que cambia el valor de la variable $contador en cada iteracin. En el ejemplo siguiente, que muestra la tabla de multiplicar de un nmero dado, puede verse como se utiliza el bucle for.

<?php /* Bucle for en PHP */ $n = 4; echo "<h1>Tabla de multiplicar</h1>"; for ($k = 1; $k <= 12; $k++) { echo $n . " * " . $k . " = " . ($n * $k) . "<br />"; } ?> Obsrvese que se inicia el bucel for en $k = 1, la segunda expresin comprueba si $k es menor o igual que 12 y, si lo es, se ejecutan las sentencias que van en el cuerpo de bucle (que imprimen el producto de $n * $k), y se incrementa $k en 1, es decir ahora $k vale 2. Luego se repite el proceso desde el principio para $k = 2, y as sucesivamente. Cuando $k deja de ser menor o igual que 12 el bucle termina. Para terminar con el bucle for, se debe comentar que tambin existe una sintaxis alternativa para dicha instruccin, esta es: for ($contador = inicio; condicin; incremento/decremento): sentencias_a_repetirse; endfor;

Bucle while
La sentencia while es aquella en la que el nmero de iteraciones no se conoce por anticipado y el cuerpo del bucle se repite mientras se cumple una determinada condicin. Su sintaxis es como sigue: while (condicin) { sentencias_a_repetirse; } El ejemplo siguiente, que calcula la suma de los n primeros nmeros naturales, demuestra cmo funciona un bucle while. <?php /* Bucle while en PHP */ $n = 10; echo "<h1>Suma de los " . $n . " primeros nmeros naturales</h1>"; $s = 0; while ($n != 0) {

$s += $n; $n--; } echo "Suma = " . $s; ?> En este caso se inicializa la variable acumulador $s = 0, luego se comprueba si $n es diferente de cero, si esto es cierto se ejecutan las sentencias contenidas en el cuerpo del bucle, es decir se incrementa el acumulador en $n unidades. Observar que en cada iteracin se decrementa el valor de $n en una unidad. El proceso se repite mientras la condicin sea cierta. Tambin es necesario comentar que el bucle while cuenta con la siguiente sintaxis alternativa: while (condicin): sentencias_a_repetirse; endwhile; Bucle do while La sentencia do . . . while funciona exactamente igual que el bucle while, excepto que la condicin no se comprueba hasta que se ha realizado una iteracin, ya que la condicin se comprueba al final de cada iteracin. Esto garantiza que, al menos, el cuerpo del bucle se ejecuta una vez, aunque la condicin no se cumpla. Su sintaxis es: do { sentencias_a_repetirse; } while (condicin); El siguiente ejemplo muestra el uso bsico de este tipo de bucle para calcular el factorial de un nmero dado, <?php /* Bucle do . . . while en PHP (c) Carlos Castillo Peralta, 2008 */ echo "<h1>Factorial de un nmero</h1>"; $n = 6; $f = 1;

do { $f *= $n; $n--; } while ($n > 1); echo "El factorial de " . $n . " es " . $f; ?> Como se observa en el ejemplo anterior, la condicin de salida del bucle se evala despus de que se hayan ejecutado las sentencias que forman el cuerpo del bucle al menos una vez.

Sentencias break y continue


Las sentencias break y continue se utilizan para romper un bucle antes de que culmine o para volver a evaluar la condicin de comprobacin antes de tiempo. El ejemplo siguiente demuestra el uso de la sentencia break utilizado para finalizar la ejecucin de un bucle. Obsrvese que el bucle finaliza cuando $k toma el valor de 5, pese a que la condicin de salida es $k <= 10. <?php /* Uso de la sentencia break en PHP */ $k = 0; do { $k++; echo $k . "<br />"; if ($k == 5) { break; } } while ($k <= 10) ?> En el siguiente ejemplo, que imprime los nmeros del 1 al 10 exceptuando el 5, se muestra el uso de la sentencia continue utilizada para saltar la ejecucin de algunas instrucciones dentro del bucle. <?php /* Uso de la sentencia continue en PHP

*/ $k = 0; do { $k++; if ($k == 5) { continue; } else { echo $k . "<br />"; } } while ($k <= 10) ?> Ejercicio prctico #2 Construya un script que muestre los nmeros de 2 en 2 hasta 100. Construya un script que muestre la sumatoria de los 10 primeros nmeros enteros positivos. Construya un script que calcule y muestre el factorial de un nmero. Construya un script que muestre acceso denegado, mientras que la contrasea sea la incorrecta.

LOGROS DE APRENDIZAJE
1. Maneja la interfaz de programacin de PHP, formularios, propiedades y controles bsicos. 2. Maneja las estructuras bsicas del lenguaje (definicin de variables, condicionales, ciclos repetitivos, funciones y procedimientos) 3. Identifica y programa eventos asociados a controles. 4. Desarrolla ejercicios utilizando programacin orientada a objetos. 5. Maneja los conceptos bsicos de Bases de Datos y los aplica en el diseo apropiado del modelo relacional (Diagrama entidad relacin). 6. Implementa el modelo de bases de datos relacional en MySQL server. 7. Gestiona bases de datos aplicando sentencias Sql.
LOGROS POR COMPETENCIA

1. Desarrollar el sistema de informacin que cumpla con los requerimientos de la solucin informtica.

CONTROLES EN FORMULARIOS
Estos son los diferentes tipos de controles que pueden incluirse en un formulario: Explicacin previa Caja de texo, caja de contrasea y rea de texto Casilla de verificacin Botn radio Men Control oculto Botn Enviar (submit) Archivo Imagen

Explicacin previa Para que un control enve informacin es necesario: que el control est incluido en un formulario (<form>). que el formulario tenga establecido el atributo action, con la direccin absoluta o relativa del fichero php que procesar la informacin que el control tenga establecido el atributo name Nota: el atributo name puede contener cualquier carcter (nmeros, acentos, guiones, etc), pero si contiene espacios, PHP sustituye los espacios por guiones bajos (_) al procesar los datos enviados. que el formulario contenga un botn de tipo submit

El siguiente ejemplo muestra un formulario vlido (ejemplo.html):

El programa que recibe los datos los guarda automticamente en la matriz $_REQUEST. Mediante la orden print_r($_REQUEST) se puede mostrar el contenido de la matriz $_REQUEST. El siguiente ejemplo muestra lo que escribira el programa PHP (ejemplo.php) si recibiera la informacin del formulario anterior (ejemplo.html).

En los ejemplos que se encuentran en esta pgina, cada ejemplo muestra el cdigo fuente de la pgina HTML, el aspecto que tiene el control y el contenido de la matriz $_REQUEST cuando se recibe la informacin.

CAJA DE TEXTO, CAJA DE CONTRASEA Y REA DE TEXTO


Este control se enva siempre. El valor enviado es el contenido de la caja o rea.

En XHTML no se puede limitar el tamao del contenido de un rea de texto, aunque s que se puede hacer con JavaScript.

CASILLA DE VERIFICACIN
Este control se enva solamente si se marca la casilla. El valor enviado es "on" si la casilla no tiene definido el atributo value o el valor del aributo value si ste est definido.

BOTN RADIO
Este control se enva solamente si se marca alguno de los botones radio que forman el control. El valor enviado es "on" si el botn marcado no tiene definido el atributo value o el valor del atributo value si ste est definido.

MEN
Este control enva siempre la opcin elegida. El valor enviado es el contenido de la etiqueta option elegida si la opcin elegida no tiene definido el atributo value o el valor del aributo value si ste est definido. Si el men admite seleccin mltiple, entonces el nombre del men debe acabar con corchetes ([]) y se enva como una matriz, de tantos elementos como opciones se hayan elegido.

CONTROL OCULTO
Este control se enva siempre y el valor enviado es el valor del atributo value.

BOTN ENVIAR (SUBMIT)


Este control se enva siempre y el valor enviado es el valor del atributo value.

ARCHIVO
El selector de archivo permite enviar un archivo desde el ordenador del cliente al servidor. En un formulario "normal", este control se enva siempre y el valor enviado es el nombre del archivo elegido.

Para que este control enve toda la informacin, el formulario debe tener el atributo enctype con el valor multipart/form-data y ser enviado con el mtodo POST. La informacin se almacena entonces en la matriz $_FILES (pero no en la variable $_REQUEST).

Antes de utilizar este control, hay que configurar en el archivo php.ini el tamao mximo de los archivos que se pueden enviar (mediante la directiva post_max_size) y es conveniente leer el captulo correspondiente a la subida de archivos del manual de PHP para conocer la manera de evitar los posibles riesgos de seguridad.

Imagen
El control de tipo imagen inserta una imagen que funciona como un botn (aunque ni Firefox ni Internet Explorer le da relieve como a los botones). Al hacer clic en un punto de la imagen es como si se hubiera pulsado a un botn submit y se envan las coordenadas del punto en el que se ha hecho clic (junto con los valores de los otros controles del formulario). Cdigo fuente Control $_REQUEST

<input type="image" name="GNU" alt="GNU" src="gnu.jpg" />

Array ( [GNU_x] => 89 [GNU_y] => 111 )

Si se define el atributo value, el formulario enva tambin el nombre del control con el valor del atributo. Ejercicio prctico #3 Con la ayuda de tu instructor y con la informacin anterior construye el siguiente formulario y enva la informacin.

Al hacer clic en enviar debe mostrar otra pagina con los siguientes resultados.

Para mas informacin visita:


http://www.mclibre.org/consultar/php/ejercicios/controles_formularios/controles_formularios.html

PROCESAMIENTO DE VARIABLES
Cuando una cadena es especificada en comillas dobles o al interior de un bloque heredoc, las variables son interpretadas en su interior. Existen dos tipos de sintaxis: una simple y una compleja. La sintaxis simple es la ms comn y conveniente. Esta ofrece una forma de interpretar una variable, un valor array, o una propiedad de un object. La sintaxis compleja fue introducida en PHP 4, y puede reconocerse por las llaves que rodean la expresin.

Sintaxis simple

Si un signo de dlar ($) es encontrado, el analizador sintctico tomar ambiciosamente tantos lexemas como le sea posible para formar un nombre de variable vlido. Rodee el nombre de la variable de llaves si desea especificar explcitamente el final del nombre.

De forma similar, puede hacer que un ndice de un array o una propiedad de un object sean interpretados. En el caso de los ndices de matrices, el corchete cuadrado de cierre (]) marca el final del ndice. Para las propiedades de objetos, se aplican las mismas reglas de las variables simples, aunque con las propiedades de objetos no existe un truco como el que existe con las variables.

Para cualquier cosa ms sofisticada, debera usarse la sintaxis compleja.

Sintaxis compleja (llaves)


Esta no es llamada compleja porque la sintaxis sea compleja, sino porque es posible incluir expresiones complejas de esta forma. De hecho, de esta forma puede incluir cualquier valor que sea parte del espacio de nombres al interior de cadenas. Simplemente escriba la expresin en la misma forma que lo hara si se encontrara por fuera de una cadena, y luego la ubica entre { y }. Ya que no es posible escapar '{', esta sintaxis ser reconocida nicamente cuando el caracter $ se encuentra inmediatamente despus de {. (Use "{\$" o "\{$" para obtener una secuencia literal "{$"). Algunos ejemplos para aclarar el asunto:

Acceso a cadenas y modificacin por carcter


Los caracteres al interior de una cadena pueden ser consultados y modificados al especificar el desplazamiento, comenzando en cero, del carcter deseado despus de la cadena entre llaves.

Nota: Para efectos de compatibilidad con versiones anteriores, aun puede usar corchetes tipo matriz para el mismo propsito. Sin embargo, esta sintaxis es obsoleta a partir de PHP 4. Ejemplo 13. Algunos ejemplos de cadenas

Funciones y operadores tiles


Las cadenas pueden ser concatenadas usando el operador '.' (punto). Note que el operador '+' (adicin) no funciona para este propsito. Por favor refirase a la seccin Operadores de cadena para ms informacin. Existen bastantes funciones tiles para la modificacin de cadenas. Vea la seccin de funciones de cadena para consultar funciones de uso general, o las funciones de expresiones regulares para bsquedas y reemplazos avanzados (en dos sabores: Perl y POSIX extendido). Existen tambin funciones para cadenas tipo URL, y funciones para encriptar/descifrar cadenas (mcrypt y mhash). Finalmente, si aun no ha encontrado lo que busca, vea tambin las funciones de tipo de caracter.

Conversin a cadena
Es posible convertir un valor a una cadena usando el moldeamiento (string), o la funcin strval().

La conversin a cadena se realiza automticamente para usted en el contexto de una expresin cuando se necesita una cadena. Esto ocurre cuando usa las funciones echo() o print(), o cuando compara el valor de una variable con una cadena. El contenido de las secciones del manual sobre Tipos y Manipulacin de Tipos ayudan a aclarar este hecho. Un valor boolean TRUE es convertido a la cadena "1", el valor FALSE se representa como "" (una cadena vaca). De esta forma, usted puede convertir de ida y vuelta entre valores booleanos y de cadena. Un nmero integer o de punto flotante (float) es convertido a una cadena que representa el nmero con sus dgitos (incluyendo la parte del exponente para los nmeros de punto flotante). Las matrices son siempre convertidas a la cadena "Array", de modo que no puede volcar los contenidos de un valor array con echo() o print() para ver lo que se encuentra en su interior. Para ver un elemento, usted tendra que hacer algo como echo $arr['foo']. Vea ms adelante algunos consejos sobre el volcado/vista del contenido completo. Los objetos son convertidos siempre a la cadena "Object". Si quisiera imprimir los valores de variables miembro de un object para efectos de depuracin, lea los pargrafos siguientes. Si quiere conocer el nombre de clase del cual un objeto dado es instancia, use get_class(). Los recursos son siempre convertidos a cadenas con la estructura "Resource id #1" en donde 1 es el nmero nico del valor resource asignado por PHP durante tiempo de ejecucin. Si quisiera obtener el tipo del recurso, use get_resource_type(). NULL se convierte siempre a una cadena vaca. Como puede apreciar, el imprimir matrices, objetos o recursos no le ofroce informacin til sobre los valores mismos. Consulte las funciones print_r() y var_dump() para conocer mejores formas de imprimir valores para depuracin. Tambin puede convertir valores PHP a cadenas y almacenarlas permanentemente. Este mtodo es conocido como seriacin, y puede ser efectuado con la funcin serialize(). Tambin puede seriar valores PHP a estructuras XML, si cuenta con soporte WDDX en su configuracin de PHP.

Conversin de cadenas a nmeros

Cuando una cadena es evaluada como un valor numrico, el valor resultante y su tipo son determinados como sigue. La cadena ser evaluada como un float si contiene cualquier caracter entre '.', 'e', o 'E'. De otra forma, evaluar como un entero.

El valor es dado por la porcin inicial de la cadena. Si la cadena comienza con datos numricos vlidos, stos sern el valor usado. De lo contrario, el valor ser 0 (cero). Un signo opcional es considerado un dato numrico vlido, seguido por uno o ms dgitos (que pueden contener un punto decimal), seguidos por un exponente opcional. El exponente es una 'e' o 'E' seguida de uno o ms dgitos.

Para ms informacin sobre esta conversin, vea la pgina del manual Unix sobre strtod(3). Si quisiera probar cualquiera de los ejemplos presentados en esta seccin, puede cortar y pegar los ejemplos e insertar la siguiente lnea para verificar por s mismo lo que est sucediendo:

No espere obtener el cdigo de un caractar convirtindolo a un entero (como lo hara en C, por ejemplo). Use las funciones ord() y chr() para convertir entre cdigos de caracter y caracteres.

NULL
El valor especial NULL representa que una variable no tiene valor. NULL es el nico valor posible del tipo NULL. Nota: El tipo null se introdujo en PHP 4 Una variable es considerada como NULL si

se ha asignado la constante NULL a la variable. no ha sido definida con valor alguno. ha sido eliminada con unset(). Sintaxis Existe un solo valor de tipo NULL, y ese es la palabra clave NULL, insensible a maysculas y minsculas.

Vea tambin is_null() y unset(). LOGROS 3 SEMANA

VARIABLES Conceptos Bsicos


En PHP las variables se representan como un signo de dlar seguido por el nombre de la variable. El nombre de la variable es sensible a minsculas y maysculas. Los nombres de variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable valido tiene que empezar con una letra o una raya (underscore), seguido de cualquier nmero de letras, nmeros y rayas. Como expresin regular se podria expresar como: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' Nota: En nuestro caso, una letra es a-z, A-Z, y los caracteres ASCII del 127 al 255 (0x7f-0xff).

En PHP3, las variables siempre se asignan por valor. Esto significa que cuando se asigna una expresin a una variable, el valor ntegro de la expresin original se copia en la variable de destino. Esto quiere decir que, por ejemplo, despus e asignar el valor de una variable a otra, los cambios que se efecten a una de esas variables no afectar a la otra. Para ms informacin sobre este tipo de asignacin, vea Expresiones.

PHP4 ofrece otra forma de asignar valores a las variables: asignar por referencia. Esto significa que la nueva variable simplemente referencia (en otras palabras, "se convierte en un alias de" "apunta a") la variable original. Los cambios a la nueva variable afectan a la original, y viceversa. Esto tambin significa que no se produce una copia de valores; por tanto, la asignacin ocurre ms rpidamente. De cualquier forma, cualquier incremento de velocidad se notar slo en los bucles crticos cuando se asignen grandes matrices u objetos. Para asignar por referencia, simplemente se antepone un ampersand signo "&" al comienzo de la variable cuyo valor se est asignando (la variable fuente). Por ejemplo, el siguiente trozo de cdigo produce la salida 'Mi nombre es Bob' dos veces:

Algo importante a tener en cuenta es que slo las variables con nombre pueden ser asignadas por referencia.

Variables predefinidas
PHP proporciona una gran cantidad de variables predefinidas a cualquier script que se ejecute. De todas formas, muchas de esas variables no pueden estar completamente documentadas ya que dependen de sobre qu servidor se est ejecutando, la versin y configuracin de dicho servidor, y otros factores. Algunas de estas variables no estarn disponibles cuando se ejecute PHP desde la lnea de comandos.Para obtener una lista de estas variables podeis consultar la seccin Variables predefinidas reservadas. Aviso A partir de PHP 4.2.0, el valor por defecto de la directiva PHP register_globals es off

(desactivada). Este es un cambio importante en PHP. Teniendo register_globals off afecta el conjunto de variables predefinidas disponibles en el sistema. Por ejemplo, para obtener DOCUMENT_ROOT se usar $_SERVER['DOCUMENT_ROOT'] en vez de $DOCUMENT_ROOT $_GET['id'] de la URL http://www.example.com/test.php?id=3 en vez de $id $_ENV['HOME'] en vez de $HOME. Para ms informacin sobre este cambio, podeis consultar el apartado de configuracin sobre register_globals, el captulo sobre seguridad Usando "Register Globals" , asi como los anuncios de lanzamiento de PHP 4.1.0 y 4.2.0 El uso de las variables reservadas predefinidas en PHP, como matrices superglobales es recomendable. A partir de PHP 4.1.0, PHP ofrece un conjunto adicional de matrices predefinidas, conteniendo variables del servidor web, el entorno y entradas del usuario. Estas nuevas matrices son un poco especiales porque son automticamente globales. Por esta razn, son conocidas a menudo como "autoglobales" "superglobales". Las superglobales se mencionan ms abajo; sin embargo para una lista de sus contenidos y ms informacin sobre variables predefinidas en PHP. Podras ver como las variables predefinidas antiguas ($HTTP_*_VARS) todava existen. A partir de PHP 5.0.0, las matrices de tipo "long" de variables predefinidas, se pueden desactivar con la directiva register_long_arrays. Variables variables: Las superglobales no pueden usarse como variables variables. Si ciertas variables no son definidas en variables_order, las matrices PHP predefinidas asociadas a estas, estarn vacias. PHP superglobales $GLOBALS Contiene una referencia a cada variable disponible en el espectro de las variables del script. Las llaves de esta matriz son los nombres de las variables globales. $GLOBALS existe desde PHP 3. $_SERVER Variables definidas por el servidor web directamente relacionadas con el entorno en donde el script se esta ejecutando. Anloga a la antigua matriz $HTTP_SERVER_VARS (la cual est todava disponible, aunque no se use).

$_GET Variables proporcionadas al script por medio de HTTP GET. Anloga a la antigua matriz $HTTP_GET_VARS (la cual est todava disponible, aunque no se use). $_POST Variables proporcionadas al script por medio de HTTP POST. Anloga a la antigua matriz $HTTP_POST_VARS (la cual est todava disponible, aunque no se use). $_COOKIE Variables proporcionadas al script por medio de HTTP cookies. Anloga a la antigua matriz $HTTP_COOKIE_VARS (la cual est todava disponible, aunque no se use). $_FILES Variables proporcionadas al script por medio de la subida de ficheros via HTTP . Anloga a la antigua matriz $HTTP_POST_FILES (la cual est todava disponible, aunque no se use). Vea tambin Subiendo ficheros por mtodo POST para ms informacin. $_ENV Variables proporcionadas al script por medio del entorno. Anloga a la antigua matriz $HTTP_ENV_VARS (la cual est todava disponible, aunque no se use). $_REQUEST Variables proporcionadas al script por medio de cuaquier mecanismo de entrada del usuario y por lo tanto no se puede confiar en ellas. La presencia y el orden en que aparecen las variables en esta matriz es definido por la directiva de configuracin variables_order. Esta matriz no tiene un anlogo en versiones anteriores a PHP 4.1.0. Vea tambin import_request_variables(). Nota: Cuando se utiliza la linea de comandos, argv y argc no son incluidas aqu; estas variables se podrn encontrar en la matriz $_SESSION Variables registradas en la sesin del script. Anloga a la antigua matriz $HTTP_SESSION_VARS (la cual est todava disponible, aunque no se use). Vea tambin la seccin Funciones para el manejo de sesiones para ms informacin.

mbito de las variables


El mbito de una variable es el contexto dentro del que la variable est definida. La mayor parte de las variables PHP slo tienen un mbito simple. Este mbito simple tambin abarca los ficheros incluidos y los requeridos. Por ejemplo:

Aqu, la variable $a dentro del script incluido b.inc. De todas formas, dentro de las funciones definidas por el usuario aparece un mbito local a la funcin. Cualquier variables que se use dentro de una funcin est, por defecto, limitada al mbito local de la funcin. Por ejemplo:

Este script no producir salida, ya que la orden echo utiliza una versin local de la variable $a, a la que no se ha asignado ningn valor en su mbito. Puede que usted note que hay una pequea diferencia con el lenguaje C, en el que las variables globales estn disponibles automticamente dentro de la funcin a menos que sean expresamente sobrescritas por una definicin local. Esto puede causar algunos problemas, ya que la gente puede cambiar variables globales inadvertidamente. En PHP, las variables globales deben ser declaradas globales dentro de la funcin si van a ser utilizadas dentro de dicha funcin. Veamos un ejemplo:

El script anterior producir la salida "3". Al declarar $a y $b globales dentro de la funcin, todas las referencias a tales variables se referirn a la versin global. No hay lmite al nmero de variables globales que se pueden manipular dentro de una funcin.

Un segundo mtodo para acceder a las variables desde un mbito global es usando la matriz $GLOBALS. El ejemplo anterior se puede reescribir as:

La matriz $GLOBALS es una matriz asociativa con el nombre de la variable global como clave y los contenidos de dicha variable como el valor del elemento de la matriz. $GLOBALS existe en cualquier mbito, esto pasa porque $GLOBALS es una superglobal. Aqu tienes un ejemplo que demuestra el poder de las superglobales:

Otra caracterstica importante del mbito de las variables es la variable static. Una variable esttica existe slo en el mbito local de la funcin, pero no pierde su valor cuando la ejecucin del programa abandona este mbito. Consideremos el siguiente ejemplo:

Esta funcin tiene poca utilidad ya que cada vez que es llamada asigna a $a el valor 0 y representa un "0". La sentencia $a++, que incrementa la variable, no sirve para nada, ya que en cuanto la funcin termina la variable $a desaparece. Para hacer una funcin til para contar, que no pierda la pista del valor actual del conteo, la variable $a debe declararse como esttica:

Ahora, cada vez que se llame a la funcin Test(), se representar el valor de $a y se incrementar. Las variables estticas tambin proporcionan una forma de manejar funciones recursivas. Una funcin recursiva es la que se llama a s misma. Se debe tener cuidado al escribir una funcin recursiva, ya que puede ocurrir que se llame a s misma indefinidamente. Hay que asegurarse de implementar una forma adecuada de terminar la recursin. La siguiente funcin cuenta recursivamente hasta 10, usando la variable esttica $count para saber cundo parar:

En motor Zend 1, utilizado por PHP4, implementa los modificadores static y global para variables en trminos de referencias. Por ejemplo, una variable global verdadera importada dentro del mbito de una funcin con global, crea una referencia a la variable global. Esto puede ser causa de un comportamiento inesperado, tal y como podemos comprobar en el siguiente ejemplo:

Al ejecutar este ejemplo obtendremos la siguiente salida: NULL object(stdClass)(0) {} Un comportamiento similar se aplica a static. Referencias no son guardadas estticamente.

Al ejecutar este ejemplo obtendremos la siguiente salida:

Este ejemplo demuestra que al asignar una referencia a una variable esttica, esta no es recordada cuando se invoca la funcion &get_instance_ref() por segunda vez.

VARIABLES
A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son nombres de variables que se pueden establecer y usar dinmicamente. Una variable normal se establece con una sentencia como:

Una variable variable toma el valor de una variable y lo trata como el nombre de una variable. En el ejemplo anterior, hello, se puede usar como el nombre de una variable utilizando dos signos de dlar. p.ej.

En este momento se han definido y almacenado dos variables en el rbol de smbolos de PHP: $a, que contiene "hello", y $hello, que contiene "world". Es ms, esta sentencia:

Produce el mismo resultado que:

p.ej. ambas producen el resultado: hello world. Para usar variables variables con matrices, hay que resolver un problema de ambigedad. Si se escribe $$a[1] el intrprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se pretenda utilizar $$a como variable y el ndice [1] como ndice de dicha variable. La sintaxis para resolver esta ambigedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo. Aviso Tener en cuenta que variables variables no pueden usarse con Matrices superglobales. Esto significa que no se pueden hacer cosas como ${$_GET}. Si buscas un mtodo para manejar la disponibilidad de superglobales y las antiguas HTTP_*_VARS, puedes intentar referiros a ellas.

VARIABLES EXTERNAS A PHP


Formularios HTML (GET y POST) Cuando se enva un formulario a un script PHP, las variables de dicho formulario pasan a estar automticamente disponibles en el script gracias a PHP. Por ejemplo, consideremos el siguiente formulario: Ejemplo 14. Variables de formulario simples

Dependiendo de tu configuracin y preferencias personales, existen muchas maneras de acceder a los datos de tus formularios HTML. Algunos ejemplos: Ejemplo 15. Accediendo datos de un formulario simple HTML POST

Usando un formulario GET es similar excepto en el uso de variables predefinidas, que en este caso sern del tipo GET. GET tambin se usa con QUERY_STRING (la informacin despues del smbolo '?' en una URL). Por ejemplo http://www.example.com/test.php?id=3 contiene datos GET que son accesibles con $_GET['id']. Vea tambin $_REQUEST y import_request_variables(). Nota: Matrices superglobales, como $_POST y$_GET, estn disponibles desde PHP 4.1.0. Como hemos dicho, antes de PHP 4.2.0, el valor por defecto de register_globals era on (activado). Y, en PHP 3 estba siempre activado. La comunidad PHP anima a no confiar en esta directiva ya que es preferible asumir que tiene el valor off (desactivada) y programar teniendo en cuenta esto. Nota: La directiva de configuracin magic_quotes_gpc afecta a valores Get, Post y Cookie, Si esta activada (on) el valor (It's "PHP!") sera convertido automaticamente a (It\'s \"PHP!\"). "Escaping" es necesario en inserciones a bases de datos. Vea tambin addslashes(), stripslashes() y magic_quotes_sybase. PHP tambien entiende matrices en el contexto de variables de formularios. (vea la faq relacionada). Se puede, por ejemplo, agrupar juntas variables relacionadas usar esta caracterstica para obtener valores de una entrada "select2 mltiple. Por ejemplo, vamos a mandar un formulario asi mismo y a presentar los datos cuando se reciban:

Ejemplo 16. Variables de formulario ms complejas en PHP 3, el uso de matrices de variables de formularios est limitado a matrices unidimensionales. En PHP 4, no existe esta restriccin.

IMAGE SUBMIT variable names


Cuando mandamos un formulario, es posible usar una imagen en vez del botn estndar de "mandar":

Cuando el usuario hace click en cualquier parte de la imagen, el formulario que la acompaa se transmitir al servidor con dos variables adicionales, sub_x y sub_y. Estas contienen las coordenadas del click del usuario dentro de la imagen. Los ms experimentados puede notar que los nombres de variable enviados por el navegador contienen un guin en vez de un subrayado (guin bajo), pero PHP convierte el guin en subrayado automticamente.

LOGROS DE APRENDIZAJE
1. Maneja la interfaz de programacin de PHP, formularios, propiedades y controles bsicos. 2. Maneja las estructuras bsicas del lenguaje (definicin de variables, condicionales, ciclos repetitivos, funciones y procedimientos) 3. Identifica y programa eventos asociados a controles. 4. Desarrolla ejercicios utilizando programacin orientada a objetos. 5. Maneja los conceptos bsicos de Bases de Datos y los aplica en el diseo apropiado del modelo relacional (Diagrama entidad relacin). 6. Implementa el modelo de bases de datos relacional en MySQL server. 7. Gestiona bases de datos aplicando sentencias Sql.
LOGROS POR COMPETENCIA

1. Desarrollar el sistema de informacin que cumpla con los requerimientos de la solucin informtica.

VECTORES ASOCIATIVOS
Este tipo de vectores no es comn a otros lenguajes, pero en PHP son de uso indispensable en distintas situaciones (ya lo empleamos cuando recuperamos informacin de un formulario accediendo al vector $_REQUEST que crea PHP en forma automtica, cuando accedamos a datos de una base de datos tambin lo emplearemos etc.) Un vector asociativo permite acceder a un elemento del vector por medio de un subndice de tipo string. Inicialmente uno piensa que esto nos complica las cosas, como veremos ms adelante la realidad nos demuestra lo contrario. Como ejemplo, consideremos que deseamos guardar en un vector el DNI, nombre y direccin de una persona. Empleando un vector con subndice entero la solucin sera: <?php $registro[]="20456322"; $registro[]="Martinez Pablo"; $registro[]="Colon 134"; ?> De esta forma debemos recordar que cuando deseamos mostrar el nombre de la persona debemos acceder al subndice 1. Esto es sencillo si tenemos un vector con tres elementos, pero que sucede si debemos almacenar 20 datos relacionados en un vector? Un vector asociativo se define de la siguiente forma:

<?php $registro['dni']="20456322"; $registro['nombre']="Martinez Pablo"; $registro['direccion']="Colon 134"; echo $registro['nombre']; ?> Ahora vemos que para imprimir el nombre de la persona no debemos recordar una posicin dentro de un vector sino un nombre de clave. Esto se hace indispensable cuando administramos un conjunto de datos grandes. En un vector asociativo toda componente est asociada a una clave. Otras formas de crear un vector asociativo: <?php $registro=array('dni'=>'20456322', 'nombre'=>'Martinez Pablo', 'direccion'=>'Colon 134'); echo $registro['dni']; ?>

FUNCIONES EN PHP
Una de las herramientas ms importantes en cualquier lenguaje de programacin son las funciones. Una funcin consiste en un conjunto de rutinas y acciones que a lo largo del script van a ser ejecutadas multitud de veces agrupados en una FUNCION y desde cualquier punto del script puede ser llamada y ejecutada. A su vez, esta funcin puede recibir parmetros externos de los cuales dependa el resultado de una funcin. Las funciones deben ser colocadas siempre antes de realizar la llamada a la funcin (como es lgico). La sintaxis de una funcin es la siguiente: function nombre(parmetros){ instrucciones de la funcin} para llamar a la funcin sera de la siguiente forma: nombre(parmetros) Un ejemplo para entender el uso de funciones es el siguiente: Crearemos una funcin que realice la suma de dos nmeros y muestre el resultado function sumar($sumando1,$sumando2){

$ suma=$sumando1+$sumando2 echo $sumando1."+".$sumando2."=".$suma; } sumar(5,6) Un hecho relevante que cabe destacar es que las variables que declaremos dentro de la funcin solo existirn o tendrn dicho valor dentro de la funcin. Existen casos en los cuales no sabemos el nmero de parmetros que le pasaremos a la funcin y en estos casos debemos usar las funciones creadas al efecto como son: func_num_args() Numero de parmetros que se le han pasado a la funcin func_get_args() Devuelve un elemento de los que forman la lista de argumentos

PHP Y MySQL
Obtener registros de una base de datos MySQL utilizando PHP es una de las tareas mas comunes que se le presenta a todo desarrollador web, por ello les presentamos un pequea gua para consultar registros utilizando PHP.

Creando la Base de datos


Obviamente para este ejemplo necesitamos una base de datos que la llamaremos demo, dentro crearemos un tabla llamada empresa la cual tendr los siguientes campos: idemp, nombre, direccion, telefono, imagen. Este es el script para crear la base de datos y la tabla.

Ejercicio prctico #3
Elabore este script en bloc de notas y verifique la existencia de dicha tabla en my SQL, este programa se instala al ejecutar la aplicacin appserv-win32 2.5.7, y sigua los pasos que se le indican a continuacin.
use demo; #---------------------------# Table structure for empresa #---------------------------CREATE TABLE `empresa` (

`idemp` int(11) NOT NULL auto_increment, `nombre` varchar(180) NOT NULL default '', `direccion` varchar(180) NOT NULL default '', `telefono` int(8) NOT NULL default '0', `imagen` varchar(50) NOT NULL default '', PRIMARY KEY (`idemp`) ); #---------------------------# Records for table empresa #---------------------------insert into empresa values (4, 'Pesacon', 'Jr. Los Astrnomos Mz. C 11 Lt. 13', 3872056, 'b55dd5_001048 balanzas pesacon.jpg'), (46, 'Quipu Digital', 'Carret. Central Km. 21, 730', 3584531, '424cce_001040 internet quipu digital.jpg'), (13, 'Courier Cristiano Jeshua', 'Jr. Risso 538', 96464860, 'd621a7_001103 courier jeshua.jpg'), (17, 'Serv. Ledesma SAC', 'Prolg. Iquitos 2200', 2659006, 'ledesma.jpg'), (18, 'Sonido Profesional Arriola', 'Alicia Alarcn 400', 4820496, '7a88d4_001416 equipos de sonido arriola.jpg'), (25, 'Juegos Emperatriz', 'Teodoro Crdenas 790, Sta. Beatriz', 4714603, 'fc0c9b_002216 juego recreativos.jpg'), (27, 'Stockholm Hipermedia S.A.', 'Los Calderos 140, Urb. Vulcano', 3494222, '898810_001044 muebles stockhom.jpg'), (28, 'Notaria Beatriz Zevallos G.', 'Av. Tpac Amaru 782, 2 Piso', 4852526, 'd02fcf_001025 notaria giampietri.jpg'), (30, 'A & B Hidrosistemas SAC', 'Av. Toms Marsano 1265', 2710263, 'cb2dc7_002207 Hidrosistemas.jpg'), (33, 'Macro Work SAC', 'Calle La Habana 280', 4222122, 'a92b21_002003 macro word.jpg'), (36, 'Per Systems SA', 'Av. Arenales 2523', 4226322, '32f133_002086-perantivirus.jpg'), (37, 'Transporte Torre Fuerte', 'Calle Costa Azul Mz. B Lt. 16', 2511749, 'cdcd2d_002113 transporte torre fuerte 1.jpg'), (51, 'Global Medica', 'Jr. Pablo Bermudez 192', 4336470, '556cd1_001375 clinica global medica.jpg'), (39, 'Distribuidora Mesajil Hnos.', 'Jr. Caman 1163', 4239453, '9be658_002002 mesajil hnos s.a.c.jpg'), (55, 'Lima International School', 'Av. La Molina 1255, Sol de La Molina', 4790846, '2a5958_002213school tomorrow 3.jpg'), (59, 'Sandwiches Passatore', 'Jr. Toribio Seminario 696', 4508684, '46d48f_002208 sandwiches passatore.jpg'), (61, 'Publimedios', 'Av. Independencia 879, Huamanga', 312436, '9c6a82_002226 publicistas publimedios.jpg'), (63, 'AJEPER', 'Av. La Paz Lt.30, Sta. Mara de Huachipa', 3711812, 'a31ad0_gaseosas ajeper 001404.jpg');

Conectando PHP y MySQL


Para obtener los datos desde MySQL necesitamos una conexin (una forma de enlazar o comunicarse), la cual nos permitir extraer datos de la misma. Para ello PHP tiene una serie de funciones exclusivamente para interactuar con mysql. Entonces para la conexin utilizaremos la funcin mysql_connect y luego mysql_select_db el cual nos permite definir a que base de datos del servidor deseamos conectarnos.
1. 2. $conexion = mysql_connect("localhost", "usuario", "clave"); mysql_select_db("demo", $conexion);

Obteniendo registros de la Base de Datos


Una vez que tenemos una conexin lo siguiente es extraer los datos, esto lo hacemos enviando consultas SQL mediante la funcin mysql_query. Tambin obtenemos el nmero total de registros devueltos por nuestra consulta.
1. 2. 3. $queEmp = "SELECT * FROM empresa ORDER BY nombre ASC"; $resEmp = mysql_query($queEmp, $conexion) or die(mysql_error()); $totEmp = mysql_num_rows($resEmp);

Mostrando los resultados.


Finalmente mostramos los resultados obtenidos de nuestra consulta, para ello extraemos cada resultado utilizando la funcin mysql_fetch_assoc la cual devuelve una matriz asociativa utilizando los nombres de los campos de la tabla.
1. if ($totEmp> 0) {

2. 3. 4. 5. 6. 7. }

while ($rowEmp = mysql_fetch_assoc($resEmp)) { echo "<strong>".$rowEmp['nombre']."</strong><br>"; echo "Direccion: ".$rowEmp['direccion']."<br>"; echo "Telefono: ".$rowEmp['telefono']."<br><br>"; }

Ntese que primero hemos verificado si existen resultados y luego verificamos en cada pasada de la sentencia While si existe el siguiente resultado para luego mostrarlo. Asi como hemos consultado registros, podemos insertar, editar y eliminar registros enviando sentencias SQL a la base de datos. Para finalizar se muestra los resultados que se deben obtener con estos scripts y tambin los archivos para descargar. (php-mysql.zip)

Ejemplo PHP-MySQL
A & B Hidrosistemas SAC Direccion: Av. Toms Marsano 1265 Telefono: 2710263 AJEPER Direccion: Av. La Paz Lt.30, Sta. Mara de Huachipa Telefono: 3711812 Courier Cristiano Jeshua Direccion: Jr. Risso 538Telefono: 96464860 Distribuidora Mesajil Hnos. Direccion: Jr. Caman 1163 Telefono: 4239453 Global Medica Direccion: Jr. Pablo Bermudez 192 Telefono: 4336470 Inka Tours Direccion: Av Pardo 123 Miraflores Telefono: 511 Juegos Emperatriz Direccion: Teodoro Crdenas 790, Sta. Beatriz Telefono: 4714603 Lima International School Direccion: Av. La Molina 1255, Sol de La Molina Telefono: 4790846 Macro Work SAC Direccion: Calle La Habana 280 Telefono: 4222122 Notaria Beatriz Zevallos G. Direccion: Av. Tpac Amaru 782, 2 Piso Telefono: 4852526

Per Systems SA Direccion: Av. Arenales 2523 Telefono: 4226322 Pesacon Direccion: Jr. Los Astrnomos Mz. C 11 Lt. 13 Telefono: 3872056 Publimedios Direccion: Av. Independencia 879, Huamanga Telefono: 312436 Quipu Digital Direccion: Carret. Central Km. 21, 730 Telefono: 3584531 Sandwiches Passatore Direccion: Jr. Toribio Seminario 696 Telefono: 4508684 Serv. Ledesma SAC Direccion: Prolg. Iquitos 2200 Telefono: 2659006 Sonido Profesional Arriola Direccion: Alicia Alarcn 400 Telefono: 4820496 Stockholm Hipermedia S.A. Direccion: Los Calderos 140, Urb. Vulcano Telefono: 3494222 Transporte Torre Fuerte Direccion: Calle Costa Azul Mz. B Lt. 16 Telefono: 2511749

Cookies HTTP
PHP soporta cookies de HTTP de forma transparente tal y como estn definidas en en las Netscape's Spec. Las cookies son un mecanismo para almacenar datos en el navegador y as rastrear o identificar a usuarios que vuelven. Se pueden crear cookies usando la funcin SetCookie(). Las cookies son parte de la cabecera HTTP, as que se debe llamar a la funcin SetCookie antes de que se enve cualquier salida al navegador. Es la misma restriccin que para la funcin header(). Los datos de una cookie estan disponibles en la matriz con datos de cookies apropiada, tal como $_COOKIE, $HTTP_COOKIE_VARS y tambin en $_REQUEST. vea la funcin setcookie() para ms detalles y ejemplos. Si se quieren asignar mltiples valores a una sola cookie, basta con aadir [] al nombre de la cookie para definirla como una matriz. Por ejemplo:

Esto creara dos cookies separadas aunque MyCookie ser una matriz simple en el script. Si se quiere definir una sola cookie con valores multiples, considerar primero el uso de la funcin serialize() explode() en el valor. Ntese que una cookie reemplazar a una cookie anterior que tuviese el mismo nombre en el navegador a menos que el camino (path) o el dominio fuesen diferentes. As, para una aplicacin de carro de la compra se podra querer mantener un contador e ir pasndolo. P.ej. Ejemplo 16. Ejemplo SetCookie

Puntos en los nombres de variables de entrada


Tpicamente, PHP no altera los nombres de las variables cuando se pasan a un script. De todas formas, hay que notar que el punto no es un carcter vlido en el nombre de una variable PHP. Por esta razn:

Lo que el intrprete ve es el nombre de una variable $varname, seguido por el operador de concatenacin, y seguido por la prueba (es decir, una cadena sin entrecomillar que no coincide con ninguna palabra clave o reservada conocida) 'ext'. Obviamente, no se pretenda que fuese este el resultado. Por esta razn, es importante hacer notar que PHP reemplazar automticamente cualquier punto en los nombres de variables de entrada por guiones bajos (subrayados).

Determinando los tipos de variables


Dado que PHP determina los tipos de las variables y los convierte (generalmente) segn lo necesita, no siempre resulta obvio de qu tipo es una variable dada en un momento concreto. PHP incluye varias funciones que descubren de qu tipo es una variable: gettype(), is_array(), is_float(), is_int(), is_object(), y is_string().

LOGROS DE APRENDIZAJE
8. Maneja la interfaz de programacin de PHP, formularios, propiedades y controles bsicos. 9. Maneja las estructuras bsicas del lenguaje (definicin de variables, condicionales, ciclos repetitivos, funciones y procedimientos) 10. Identifica y programa eventos asociados a controles. 11. Desarrolla ejercicios utilizando programacin orientada a objetos. 12. Maneja los conceptos bsicos de Bases de Datos y los aplica en el diseo apropiado del modelo relacional (Diagrama entidad relacin). 13. Implementa el modelo de bases de datos relacional en MySQL server. 14. Gestiona bases de datos aplicando sentencias Sql.
LOGROS POR COMPETENCIA

2. Desarrollar el sistema de informacin que cumpla con los requerimientos de la solucin informtica.

Ejercicio prctico #6
AUTOS EL SEGUNDAZO Suponga que se tiene un negocio de venta de autos, cuyo objeto es comprar y vender carros, se pretende realizar una pgina web sencilla que capture en una base de datos la informacin procedente de los vehculos que son adquiridos por el concesionario, a su vez se deben buscar vehculos en esa base de datos que cumplan con los requerimientos de los compradores. PASOS A SEGUIR 1. 2. 3. 4. Crear base de datos. Crear pagina web principal del concesionario. Crear pagina de insercin de vehculos (php) Crear pagina de consulta de vehculos (php)

1. Ingrese a phpMyAdmin y en MySQL cree una base de datos llamada mycar.

2. Crea 3 tablas, color, marca, vehculos, con la siguiente estructura.


COLOR LLAVE Si MARCA LLAVE Si CAMPO cod_color nombre_color TIPO Integer Varchar TIPO Varchar Varchar TIPO Varchar Varchar Integer varchar float float Varchar LONGITUD 25 LONGITUD 5 25 LONGITUD 10 15 4 10 NULL No No NULL No No NULL No No No No No No No

CAMPO cod_marca nombre_marca VEHICULOS LLAVE CAMPO Si id marca cilindraje traccin kilometraje precio color

25

3. L uego crea la pagina principal de del ejercicio llamada index.html, el resultado ser como esta imagen.

Cdigo html index.html


<html> <head> <title>VENTAS CAR LO MEJOR EN VEHICULOS</title> </head> <STYLE type=text/css> .tituloprin { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; font-style: normal; font-weight: 800; color: #FFFFFF; } COLOR: #FFFFFF; TEXT-DECORATION: none } A:visited { COLOR: #FFFFFF } A:hover { COLOR: #66ccff } A:active { COLOR: #FFFFFF }</STYLE> <body> <center><table width="734" border="0" height="200">

<tr> <td height="80"><img src="top.jpg"></td> </tr> </table><p>&nbsp;</p></center> <center><table width="225" border="0" cellspacing="0" cellpadding="0" background="menu.jpg"> <tr> <td height="24">&nbsp;</td> </tr> <tr> <td height="24">&nbsp;</td> </tr> <tr> <td height="39" class="tituloprin" align="center"><a href="auto.php">GRABAR VEHICULOS</a></td> </tr> <tr> <td height="38" class="tituloprin" align="center"><a href="buscar.php">BUSCAR VEHICULOS</a></td> </tr> <tr> <td height="62">&nbsp;</td> </tr> </table></center> <p align="center">&nbsp;</p> <p> <center></div> </center> </p> </body> </html>

1. Crea la pagina de ingreso de vehculos llamada auto.php, el resultado ser el siguiente.

Cdigo pagina auto.php


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Documento sin t&iacute;tulo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <STYLE type=text/css> .tituloprin { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; font-style: normal; font-weight: 800; color: #000000; } .tituloform { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; font-style: normal; font-weight: 800; color: #FFFFFF; } </STYLE> <body> <center><table width="734" border="0" height="200"> <tr> <td height="80"><img src="top.jpg"></td> </tr> </table> <p> <table width="93%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" class="tituloprin">GRABAR VEHICULOS</td> </tr> </table> <p> <table width="50%" border="0" cellpadding="0" cellspacing="0" bgcolor="#OE588C" ><form name="form1" method="post" action="insertar.php"> <tr> <td class="tituloform">&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td class="tituloform">&nbsp;Placa:</td> <td> <input type="text" name="placa"> </td> </tr> <tr> <td class="tituloform">&nbsp;Marca</td> <td> <?php $conexion=mysql_connect("localhost","root"); $selec_db=mysql_select_db("mycar",$conexion); $sql= "select * from marca order by nombre_marca"; $resultado=mysql_query($sql, $conexion); echo "<select name='marca' value='' >"; while ($row=mysql_fetch_array($resultado)) { echo '<option>'.$row["nombre_marca"].'</option>'; }

mysql_free_result($resultado) ?> </td> </tr> <tr> <td class="tituloform">&nbsp;Cilindraje</td> <td> <input type="text" name="cil"> </td> </tr> <tr> <td class="tituloform">&nbsp;Tracci&oacute;n</td> <td> <input type="text" name="tra"> </td> </tr> <tr> <td class="tituloform">&nbsp;Kilometraje</td> <td> <input type="text" name="kil"> </td> </tr> <tr> <td class="tituloform">&nbsp;Precio</td> <td> <input type="text" name="precio"> </td> </tr> <tr> <td class="tituloform">&nbsp;Color</td> <td> <?php $conexion=mysql_connect("localhost","root"); $selec_db=mysql_select_db("mycar",$conexion); $sql= "select * from color order by nombre_color"; $resultado=mysql_query($sql, $conexion); echo "<select name='color' value='' >"; while ($row=mysql_fetch_array($resultado)) { echo '<option>'.$row["nombre_color"].'</option>'; } mysql_free_result($resultado) ?> </td> </tr> <tr> <td colspan="2">&nbsp;</td> </tr> <tr> <td colspan="2" align="center"><input type="submit" name="Submit" value="GRABAR"></td> </tr> <tr> <td colspan="2"> <div align="center"> </div></td> </tr> </table> </center> </form></html>

1. Al hacer clic en grabar en la pagina invocara la pgina insertar.php y mostrara una notificacin de operacin exitosa as:

Este es el cdigo de la pgina insertar.php


<html> <head> <title>Documento sin t&iacute;tulo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php $placa=$_POST['placa']; $marca=$_POST['marca']; $cil=$_POST['cil']; $tra=$_POST['tra']; $kil=$_POST['kil']; $precio=$_POST['precio']; $color=$_POST['color']; $conexion=mysql_connect("localhost","root"); $selec_db=mysql_select_db("mycar",$conexion); $querydb=mysql_query("INSERT INTO vehiculos (id,marca,cilindraje,traccion,kilometraje,precio,color) VALUES('$placa','$marca','$cil','$tra','$kil','$precio','$color')"); $result=mysql_query($querydb, $conexion); ?> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <center> <table width="351" border="0" cellspacing="0" cellpadding="0"> <form action="auto.php" method="post"> <td width="208"> <tr> <td colspan="2"></td> </tr> <tr> <td colspan="2"><img src="registro.jpg"></td> </tr> <tr>

<td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td><img src="carro.jpg"></td> <td>&nbsp;</td> </tr> <tr> <td>&nbsp;</td> <td width="143">&nbsp;</td> </tr> <tr> <td colspan="2" align="center"><input name="submit" type="submit" class="boton" value="ACEPTAR"></td> </tr> <tr> <td colspan="2">&nbsp;</td> </tr> </form> </table> </center> </body> </html>

2. Finalmente realiza la pagina de consulta en la base de datos llamada buscar.php

1. El siguiente es el cdigo de la pgina buscar.php, all se escriben y seleccionan los parmetros de la bsqueda. Cdigo pagina buscar.php
<html> <head> <title>Documento sin t&iacute;tulo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

</head> <STYLE type=text/css> .tituloprin { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; font-style: normal; font-weight: 800; color: #FFFFFF; } </STYLE> <body> <center><table width="734" border="0" height="200"> <tr> <td height="80"><img src="top.jpg"></td> </tr> </table> <p><table width="93%" border="0" cellpadding="0" cellspacing="0"> <tr> <td align="center" class="tituloform">BUSCAR VEHICULO</td> </tr> </table> <p>&nbsp;</p> </center> <center> <table width="50%" border="0" cellpadding="0" cellspacing="0" bgcolor="#OE588C" ><form name="form1" method="post" action="resultado.php"> <tr> <td class="tituloform">&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td class="tituloprin">&nbsp;Marca</td> <td> <?php $conexion=mysql_connect("localhost","root"); $selec_db=mysql_select_db("mycar",$conexion); $sql= "select * from marca order by nombre_marca"; $resultado=mysql_query($sql, $conexion); echo "<select name='marca' value='' >"; echo '<option>&nbsp;</option>'; while ($row=mysql_fetch_array($resultado)) { echo '<option>'.$row["nombre_marca"].'</option>'; } mysql_free_result($resultado) ?> </td> </tr> <tr> <td class="tituloprin">&nbsp;Cilindraje</td> <td> <input type="text" name="cil" value=""> </td> </tr> <tr> <td class="tituloprin">&nbsp;Kilometraje</td> <td> <input type="text" name="kil" value=""> </td>

</tr> <tr> <td class="tituloprin">&nbsp;Color</td> <td> <?php $conexion=mysql_connect("localhost","root"); $selec_db=mysql_select_db("mycar",$conexion); $sql= "select * from color order by nombre_color"; $resultado=mysql_query($sql, $conexion); echo "<select name='color' value='' >"; echo '<option>&nbsp;</option>'; while ($row=mysql_fetch_array($resultado)) { echo '<option>'.$row["nombre_color"].'</option>'; } mysql_free_result($resultado) ?> </td> </tr> <tr> <td colspan="2">&nbsp;</td> </tr> <tr> <td colspan="2" align="center"><input type="submit" name="Submit" value="BUSCAR"></td> </tr> <tr> <td colspan="2"> <div align="center"> </div></td> </tr> </table> </center> </form> </p> </body> </html>

1. Al hacer clic en el botn buscar, el invoca la pagina resultado.php, que fianlmente muestra la informacin solicitada a la base de datos asi:

Cdigo de la pgina resultado.php


<html> <head> <title>Documento sin t&iacute;tulo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <STYLE type=text/css> .tituloform { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; font-style: normal; font-weight: 800; color: #000000; } </STYLE> <body> <center><table width="734" border="0" height="200"> <tr> <td height="80"><img src="top.jpg"></td> </tr> </table> <p><table width="93%" border="0" cellpadding="0" cellspacing="0"> <tr> <td align="center" class="tituloform">RESULTADOS</td> </tr> </table> <p>&nbsp;</p>

<table width="639" border="1" bordercolor="#0142D4" cellpadding="0" cellspacing="0"> <tr> <td width="101" bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">Placa</font></div></td> <td width="101" bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">Marca</font></div></td> <td width="120" bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">Cilindraje</font></div></td> <td width="85" bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">Traccion</font></div></td> <td width="109"bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">kilometraje</font></div></td> <td width="109"bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">Color</font></div></td> <td width="109"bgcolor="#OE588C" ><div align="center"><font color="#FFFFFF">Precio</font></div></td> </tr> <?php $marca=$_POST['marca']; $cil=$_POST['cil']; $tra=$_POST['tra']; $kil=$_POST['kil']; $color=$_POST['color']; $link=mysql_connect("localhost","root")or die ("error de conexion al servidor"); $db=mysql_select_db("jcotrino1_es_db",$link) or die ("error de conexion a la base de datos") ; $cons= "select id,marca,cilindraje,traccion,kilometraje,precio,color from vehiculos "; $flag = 0; if ($marca != "" || $cil != "" || $kil != "" || $color != "") { $cons .= " where ("; if ($marca != "") { $cons .= " vehiculos.marca = '$marca' "; $flag = 1; } if ($cil != "") { if ($flag == 1) { $cons .= " AND "; } else { $flag = 1; } $cons .= " vehiculos.cilindraje = '$cil' "; } if ($kil != "") { if ($flag == 1) { $cons .= " AND "; } else { $flag = 1; } $cons .= " vehiculos.kilometraje = '$fecha' "; } if ($color != "") { if ($flag == 1) { $cons .= " AND "; } else { $flag = 1; } $cons .= " vehiculos.color= '$color' "; } $cons .= " ) "; } $cons .= " order by vehiculos.marca"; //print("$cons"); $result=mysql_query($cons, $link); ?> <?php while ($row=mysql_fetch_array($result)) {

echo '<tr><td>'.$row["id"].'</td>'; echo '<td>'.$row["marca"].'</td>'; echo '<td>'.$row["cilindraje"].'</td>'; echo '<td>'.$row["traccion"].'</td>'; echo '<td>'.$row["kilometraje"].'</td>'; echo '<td>'.$row["color"].'</td>'; echo '<td>'.$row["precio"].'</td></tr>'; } mysql_free_result($result) ?> </table> </center> <center> </center> </form> </p> </body> </html>

BIBLIOGRAFIA.
JUAN DIEGO GUTIRREZ GALLARDO. Mysql 5.1. 1 edicin Anaya Multimedia. 384. PAUL DUBOIS. Mysql. Edicin Revisada Y Actualizada 2009. 1 edicin Anaya Multimedia. 928. IAN GILFILLAN. Mysql. 1 edicin Anaya Multimedia. 928. RUSSELL DYER. Mysql In A Nutshell. 320 ANDY HARRIS. Programacin Con Php 6 Y Mysql. 1 edicin. Anaya Multimedia.496 PHILLIPS JON A. DAVIS, MICHELE E. Php Y Mysql. 1 edicin. Anaya Multimedia. 496 MARTIN E. PSINAS, TIMOTHY BORONCZYK. Php Y Mysql. 1 edicin. ANAYA MULTIMEDIA. 352.

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