Opinión Ignacio Vasallo Viernes, 1 de Octubre de 2021\n"Los turoperadores operan normalmente, los turistas no dejarán de ir a La Palma y el volcán, aunque siga activo, mientras esté controlado será otra atracción"\nObservatorio (Roque de los Muchachos) en La Palma. Foto Wikimedia Commons (CC BY SA 3.0)\nLas erupciones volcánicas han influido en desarrollo de la actividad humana. Quizás la que tuvo más efectos secundarios fue la del volcán Tambora en Indonesia del 5 al 10 de abril de 1815 que, con una fuerza desconocida, mató a unas 100.000 personas, cubrió Manhattan de cenizas, provocó dos meses después la derrota de Napoleón en Waterloo —las imprevistas lluvias le impidieron maniobrar a su rapidez habitual— y, al año siguiente, recluyó a Percy y Mary Shelley en la casa de Lord Byron en el lago Leman. En vez de los paseos veraniegos, hicieron un concurso de literatura de terror y Mary escribió el Frankenstein, quizás el primer relato de ciencia ficción. Fue el famoso año sin verano.\nEn nuestra época y con consecuencias directas en el turismo, la erupción en 2010 del volcán del sur de Islandia Eyjafjallajökull –pronúnciese “eiafialayecul”— el 10 de marzo de ese año, lanzó al exterior tal cantidad de cenizas que obligó al cierre del espacio aéreo europeo durante siete días.\nLa erupción en Cumbre Vieja, en el suroeste de La Palma, es la primera desde la del Teneguía en 1971, en la misma zona. Entonces casi no había turismo. La actual no ha ocasionado muertos ni heridos, ya que todas las consecuencias directas son materiales: pérdidas de viviendas y áreas de cultivo. Tremendas, pero pueden ser materialmente, aunque no emocionalmente, compensadas.\nLa Palma es una Isla con algunos atractivos turísticos bien conocidos: el Roque de los Muchachos con su observatorio a 2.400 metros; la caldera de Taburiente, el mayor cráter volcánico emergido del mundo; y las rutas de senderismo, entre las que figura la de los volcanes. Más de 200.000 turistas visitaron la isla en 2019, de los que 150.000 fueron extranjeros y el 80% de ellos, alemanes.\nLa isla es pequeña —unos 700 kilómetros cuadrados— y cuenta con poco más de 80.000 habitantes, por lo que no está preparada para el turismo de masas, aunque hay proyectos de nuevos hoteles y campos de golf. En total solo hay unas 7.000 camas turísticas.\nLa repercusión está siendo enorme en los medios nacionales e importante en los internacionales. Mucha gente coloca a la isla en el mapa por primera vez. En Alemania es donde más atención se presta a este asunto. En Gran Bretaña han recuperado, brevemente, las viejas teorías sobre el tsunami y en el resto de los países europeos, aparte de la nacional, predomina la información sobre la Asamblea de Naciones Unidas y las elecciones en Alemania.\nEn esta primera fase se verán afectadas ligeramente todas las islas, pero esa ralentización de ventas y reservas durará solo un par de semanas. No olvidemos que estamos a las puertas de la temporada alta y que los clientes de los principales mercados tienen ganas y posibilidades de viajar.\nErupción del volcán de Cumbre Vieja (La Palma)\nLas autoridades canarias, con el apoyo de la Guardia Civil y de la UME, han actuado con eficacia y sensibilidad, controlando lo controlable y ayudando a la población local, que se está comportando ejemplarmente. La zona afectada está delimitada, de momento, a menos de doscientas hectáreas y el tráfico aéreo no ha sido interrumpido, aunque algunas compañías suspendieron sus vuelos el viernes 24.\nComo es lógico, en una primera fase predomina la seguridad de los clientes y el interés local en dedicar todos los recursos a gestionar la situación. La mayor flexibilidad en la cancelación de las reservas individuales como reacción a la pandemia, evita innecesarias tensiones. Los turoperadores operan normalmente, los turistas no dejarán de ir a La Palma y el volcán, aunque siga activo, mientras esté controlado será otra atracción, como sabemos por la experiencia de Islandia, Hawái o Guatemala.\nPero, según nos enseñan los manuales de gestión de crisis elaborados tras el fracaso de comunicación de Exxon, después del desastre de su barco Exxon Valdez en 1989, el ritmo de comunicación es importante. En España, trece años después, algunas autoridades no los habían leído y fracasaron en la gestión de la comunicación con motivo del desastre del Prestige.\nBarco petrolero 'Prestige' en pleno hundimiento\nRecordemos las líneas básicas: un solo portavoz, información continua, amplia y veraz, selección de prioridades y eludir cualquier tipo de mensaje que pueda interferir en el ritmo de la comunicación. En la primera fase, las campañas de publicidad pueden ser contraproducentes. Una fluida comunicación es lo más eficaz.\nDe momento, las autoridades canarias lo están haciendo bien con su presidente al frente y el presidente del Gobierno se ha centrado en ofrecer las máximas ayudas posibles a los afectados. Antes esta positiva situación, la única disonancia se debe a unas declaraciones de la ministra de Turismo, no por el contenido, sino por haber interferido en el ritmo de la comunicación semanas antes de que llegue el momento de hablar del turismo. Lo que está ocurriendo es una tragedia para los afectados, pero la repercusión turística será escasa.


Inicio>Tech>Los servicios de transmisión de música pagan $ 424 millones en tarifas de licencia, $ 163 millones provienen de Apple\nLos servicios de transmisión de música pagan $ 424 millones en tarifas de licencia, $ 163 millones provienen de Apple\nEl Mechanical Licensing Collective (The MLC) anunció hoy que ha recibido un total de $ 424,384,787 en tarifas de licencia de todos los servicios de transmisión de música, que incluyen Apple Music, Spotify y Amazon Music. Apple fue responsable de $ 163,338,890, que es la mayor cantidad pagada por todas las empresas.\nEl MLC llama a esto «regalías históricas acumuladas e incomparables de los proveedores de servicios digitales». Para aquellos que no están familiarizados, The MLC es una organización sin fines de lucro designada por la Oficina de Derechos de Autor de los EE. UU. De conformidad con la Ley de Modernización de la Música de 2018. Las regalías provienen de 20 proveedores diferentes, que se denominan DSP.\nEntre todos los DSP que contribuyeron a The MLC, Apple fue la empresa que pagó la tarifa de licencia de música más alta gracias a Apple Music. Spotify viene justo después con $ 152,226,039 pagados, y Amazon ocupa el tercer lugar con $ 42,741,507 pagados. La lista también incluye otros servicios como YouTube, Pandora y SoundCloud.\nLa transferencia de estos fondos representa la culminación de un esfuerzo de meses por parte del MLC y estos DSP para desarrollar e implementar las especificaciones para estos informes de uso. Con estas regalías históricas incomparables y los informes de uso ahora disponibles, el MLC puede comenzar el proceso de revisión y análisis de los datos para encontrar y pagar a los propietarios de derechos de autor adecuados.\nComo explicó Variety, el MLC comenzó a administrar licencias para servicios de transmisión elegibles en los Estados Unidos en enero de 2021. La organización ahora recauda regalías de los DSP y paga a los compositores, compositores y otros profesionales involucrados en el proyecto.\nEl 1 de enero, el MLC comenzó oficialmente a administrar una nueva licencia general que cubre las obras musicales disponibles en los servicios de audio digital con sede en Estados Unidos. Antes de que la MMA hiciera posible un sistema de licencias tan generalizado (para que los DSP con sede en EE. UU. Distribuyeran descargas permanentes, descargas limitadas y transmisiones interactivas), existía una estructura de licencias canción por canción. Con innumerables canciones en docenas de plataformas, era prácticamente imposible licenciar cada uso de cada canción, y mucho menos entregar regalías a los titulares de derechos de manera oportuna.\nPuede encontrar más detalles sobre los derechos de autor de la música en el sitio web oficial de The MLC.


Ataque israelí en Siria eleva tensiones en Medio Oriente\nLa Unión Europea analiza suspender el embargo de armas a favor de rebeldes\nRebeldes despiden a las víctimas de una masacre cerca de Aleppo AFP\nLíbano.- El ataque con misiles israelíes a la vecina Siria ha desatado el temor de que el conflicto se propague por todo Medio Oriente, mientras el embajador de Siria en Líbano amenazó a Israel con represalias "sorpresa".\n"Siria, que ha estado combatiendo por su soberanía, tomará represalias en el momento oportuno", manifestó Ali Abdul Karim, según la milicia shií libanesa Hezbolá. El diplomático señaló que Damasco contempla "la posibilidad de un ataque sorpresa", resaltó DPA.\nLa cúpula siria sostiene que los aviones de combate israelíes atacaron un centro de investigación militar cerca la capital, Damasco, y niega que el objetivo hubiera sido un convoy de armas cerca de la frontera con Líbano, como aseguran otras fuentes desde EEUU.\nEl bombardeo, que causó la muerte de dos personas, según los sirios, es el primer ataque israelí contra Siria desde 2007 y sobre todo desde 2011, cuando estalló la revuelta contra el presidente Bashar al Assad.\nRusia, uno de los últimos aliados de Siria, expresó ayer su "profunda preocupación" por las versiones sobre un ataque israelí. "Si las informaciones se confirman, sería una grave violación de la Carta de la ONU", dijo el ministerio de Relaciones Exteriores en Moscú.\nDe manera similar se manifestó el ministro de Asuntos Exteriores de Irán, Ali Akbar Salehi, que condenó a Israel.\n"Ese ataque es una clara violación de la integridad territorial de Siria y demuestra de nuevo que los sionistas (Israel) y Occidente no quieren estabilidad y seguridad en Siria", dijo a la televisión estatal IRIB.\nTambién la Liga Árabe en El Cairo tuvo duras palabras para el bombardeo israelí. El secretario general Nabil Al Arabi dijo que con este brutal ataque en territorio sirio, Israel vuelve a despreciar la soberanía de un Estado árabe.\nEl secretario general de la ONU, Ban Ki-moon, expresó por su parte una "grave preocupación" por el supuesto ataque aéreo israelí en Siria.\n"En este momento la ONU no tiene detalles sobre el incidente reportado", indicó en un comunicado. "Y la ONU tampoco está en condiciones de verificar independientemente lo que ocurrió", citó AFP.\nLa Casa Blanca advirtió este jueves a Siria contra la transferencia de armas al Hezbolá.\nLa Coalición para las Fuerzas de la Revolución y la Oposición Siria (Cnfros) aseguró que cualquier diálogo para buscar una salida al conflicto sirio no tendrá lugar hasta que Al Assad abandone el poder.\nLa alianza hizo este anuncio en un comunicado tras reunirse en El Cairo, un día después de que se desatara la polémica por las declaraciones de su presidente, Ahmed Muaz al Jatib, de que estaría dispuesto a dialogar con representantes del régimen, citó Efe.\nLa Unión Europea se mostró dispuesta a escuchar las solicitudes de apoyo material de la oposición siria y a revisar su embargo de armas para facilitar el suministro de ciertos equipos, aunque una mayoría de Estados miembros rechazan que se arme a los rebeldes.


Jueves | 29.05.2003 Clarín.com » Edición Jueves 29.05.2003 » Sociedad » Una colección para aprender los secretos de las tortas caseras\nEl segundo cuaderno, en tanto, estará dedicado a las tentadoras y requeridas tortas de chocolate. Este ingrediente les da sabor a fórmulas conocidas como Del Diablo, original, Margarita, Fuera de Serie, una verdadera esponja de chocolate, y Chiffón de cacao, que incluye café. Luego será el turno de las tortas secas. Esta definición engloba al tradicional budín inglés y a las tortas galesa, de nuez, de almendras merengada y Christmas Cake. En el cuarto cuaderno llegan las tortas mousse: de naranja, limón, chocolate, café o frutillas. La siguiente entrega propone exquisitas alternativas para la hora del té: torta crocante de manzanas, torta Fabulosa, Ginger bread, la torta norteña de limón y la Nuss Kuchen. En la elaboración de las recetas y los textos también trabajaron Lucila Baiardi directora académica del Instituto Gastronómico del sur y María Trussi, profesora de gastronomía.


Tenis adaptado: Gustavo Fernández, nuevo embajador del INADI | ParaDeportes\nGran reconocimiento para Gustavo Fernández. El representante argentino de tenis sobre silla de ruedas fue distinguido por el Instituto Nacional contra la Discriminación, Xenofobia y el Racismo (INADI) como Embajador de Buena Voluntad y Líder Positivo.\n“Ser embajador INADI es un compromiso y, en estos momentos donde en la sociedad hay mensajes contradictorios todo el tiempo, es muy importante tener embajadores que transmitan mensajes positivos. Su historia de vida es también motivacional para otros, y sobre todo para aquellos que piensan que discapacidad y deporte no pueden ir de la mano, cuando en realidad el deporte incluye a las personas”, afirmó Javier Bujan, interventor del INADI.\nPor su parte, Gustavo manifestó: “Es un honor enorme que espero poder retribuir. Conseguir logros deportivos es muy importante para mí, pero estos reconocimientos también son una palmada en la espalda que anima a seguir en este camino. Ojalá mi historia también les sirva a otras personas para darse cuenta que nadie puede decirte que no podés hacer algo y que sólo debés intentarlo”.\nFernández es el primer tenista en sumarse a la iniciativa del INADI y pasará a formar parte de la nómina de más de 40 Embajadores y Embajadoras de Buena Voluntad – Líderes Positivos, entre quienes figuran los futbolistas Leandro Romagnoli, Marcelo Barovero y Juan Manuel Insaurralde, entre otros. “Los Líderes Positivos se comprometen a difundir un mensaje para sensibilizar a la sociedad sobre las temáticas del INADI, destacando la importancia de construir modelos sociales antidiscriminatorios y de garantizar la igualdad de oportunidades e inclusión en cualquier ámbito”, enuncia el organismo.\nPreviousNatación: Arregui y un merecido reconocimiento en Rosario\nNextFútbol para ciegos: Córdoba despidió a sus Murciélagos antes de Río


Fiesta de la espuma en Madrid - Fiestas de la espuma madrid\n¿Quieres saber quien realiza las mejores fiestas de la espuma en Madrid?¿Tienes que realizar un evento y no sabes por donde empezar?¿necesitas una empresa seria para que realice tu fiesta de la espuma?\nPonte en contacto con nosotros y te organizaremos la mejor fiesta de la espuma en Madrid queremos que los participantes de tu eventos quedes satisfechos. Llevemos más de 10 años organizando eventos en el que introducimos el servicio de la fiesta de la espuma asegurando un total éxito. Contamos con los mejores cañones de la espuma modernos y potentes y utilizamos los mejores espumógenos para que no tengamos ningún problema a la hora de realizar el evento. Nuestra espuma pasa todos los controles sanitarios exigidos por la unión europea.\nLas mejores fiestas de las espuma en Madrid\nDesde Animados tambien te ofrecemos otros servicios que pueden ser de tu interés para la próxima fiesta de la espuma que realices en Madrid. A continuación se las citamos y puedes pedirnos información siempre que lo desees y tantas veces sean necesarias, ya que queremos que todo te quede claro a la hora de realizar tu fiesta o evento y no surja ningún imprevisto.\nFiesta de la espuma de colores en Madrid: te damos la opción de elegir espuma de diferentes colores a la vez de poder elegir la espuma blanca tradicional de siempre.\nFiesta de la espuma con castillos hinchables: Uno de los mejores recursos para las fiestas infantiles y juveniles son los castillos hinchables¿te imaginas como seria tu fiesta complementando la espuma con unos hinchables?\nFiesta de la espuma con música: Si vas a realizar una fiesta de la espuma en Madrid, no te preocupes por nada, si lo deseas nosotros podemos amenizar tu fiesta con música\nFiesta de la espuma más talleres: Podemos hacer que la fiesta de la espuma sea inolvidable para los niños y jóvenes de tu evento. podemos complementarlo con unos talleres, manualidades, repostería o con lo más común y mas divertido globoflexia y pintacaras\nFiesta de la espuma con decoración: podemos decorar cualquier espacio con globos de colores para que tu evento no pase desapercibido.\nFiesta de la espuma premium: complementa cualquiera de los servicios que arriba te citamos y si tu idea es otra, cuéntanosla y la llevaremos a cabo.\nCompementa tu fiesta de la espuma con el servicio de alquiler de castillos hinchables en albacete\nLlámanos y te daremos el mejor presupuesto de la fiesta de la espuma en Madrid. no somos de esas empresas que te dicen un precio y luego es otro, te daremos un precio “cerrado” y lo mas económico posible.\ntambien puedes llamarnos para organizar fiestas de fin de curso o cualquier otra fiesta infantil con el alquiler de castillos hinchables en Ciudad Real, Toledo, Cuenca o Madrid\nFiesta de la espuma en Madrid 633 206 007


Felipe González fundó la OTAN \nY le iba a fichar el Bayer Munich por un pastiche, de las antiguas pesetas, pero se jodió la rodilla...\n#4 Di que sí, algo habrán hecho. La polisía nunca actua arbitrariamente, jamás!\nSe nota que le han comido la cabeza los del consejo del huevo...\nYo creo q deberíamos hacer campaña para el el campo de fútbol sustituya al m2 en el SI.\nBen Hooper, el inglés que quiere convertirse en el primer hombre en cruzar a nado el Atlántico \nComo se entere David Meca le echa una carrera del Puerto de Palos a las Bahamas\n#463 Ya ha hecho declaraciones al respecto el portavoz de la gestora del PSOE, señalando al culpable de todo.\nLa gente sin criterio pensará que no hace falta, porque todo lo que se salga de lo políticamente correcto se mete en un gran cajón desatre en el que Podemos parece el principal exponente.\n#383 nomepega *\n#362 Eso es como pedir a un grupo de ultrasur borrachos que no apaleen a uno con la camiseta del barça. La cuestión aquí, es que era más que previsible que esto (o algo parecido) iba a ocurrir, y creo que los ponentes han visto una oportunidad de usarlo en su favor (o bien en contra de sus rivales).\n*No intento justificar el acto, de hecho me parece una cagada.\n#43 Es una cita del profesor Frink. No hay intención de reirse de nadie\n"La peor contaminación de todas... la contaminación lumíííínica"\n#19 Alabado sea el Tallarín!\n#62 Me has recordado a Fermín Trujillo: "Llámalo Dios, llámalo energía... pero algo hay!"\n#38 nomepega *\nYo sigo usando thepiratebay.cr\n#104 Sí, los apoderados estan para eso, para supervisar el recuento de papeletas y la cumplimentación de las actas. Lo que no tengo ni idea es cómo se lleva a cabo el picado de datos. Quicir, quién coteja que lo reflejado en las actas se traslada correctamente a formato digital.\n¿Y no le ha ofrecido un ministerio a Dani Rovira? Eso le da votos, fijo!\nA los vendedores humo les gusta que se venda humo. Al menos son coherentes...\n#1 Lo estoy viendo...\nHoy, en "Gente que no sabe en que puto mundo vive": Lady Meme\n#17 Era el bolero mix 11. Qué recuerdos!\nMe moló mucho, pero donde estén Los Soprano...\nAlabado sea El Tallarín!!!


▷【Novedades 2022】 ▷ Surcos con motoazada paguerd - Mejores precios y las mejores características.\nSurcos con motoazada paguerd – Mejores precios y las mejores características.\n👵🏻 13 Mejores opciones económicas a surcos con motoazada paguerd.\nUna de las labores más empleadas para las herramientas eléctricas manuales de jardín es la de labrar y airear la tierra. Aunque hay muchos tipos de arados y aireadores, los modelos pequeños con motor de gas son realmente útiles para los trabajos pequeños.\n💸 Surcos con motoazada paguerd Tutorial en video magnífico para aprender a utilizar tu maquinaria.\n🤛Conclusión y opiniones al valorar surcos con motoazada paguerd.\nLa información acá contenida ha sido compendiada a mano y está pensada para ser usada como referencia. Así que si para finalizar, desea familiarizarse con los modelos libres, consulte los vídeos y las recensiones más detalladas de nuestro sitio web.\n💫 Precios en surcos con motoazada paguerd más bajo del mercado de las máquinas agricolas.\nLa azada mecánica está diseñada para detener el motor después de 20 minutos de trabajo, eludiendo que se dañe el motor. Además de esto, merced al sistema de arranque simple de utilizar y a su extenso rango de potencia, la surcos con motoazada paguerd es capaz de realizar cualquier tarea, desde arar un huerto hasta realizar trabajos de jardinería.\n👌 Comprar surcos con motoazada paguerd a través de tu web store online. Precios reducidos!\nPuedes adquirir una gran variedad de surcos con motoazada paguerd online al mejor costo. En nuestra tienda virtual encontrarás el material que necesitas para trabajar en el campo o bien en el huerto de tu casa: desde cuchillas de azada hasta palas, paletones o bien palas. Por un lado, permiten trabajar en áreas pequeñas como huertos, invernaderos y jardines domésticos; por otra parte, también son realmente útiles en áreas grandes como campos o grandes superficies que requieren maquinaria de temporada.\n👓 Pros de comprar surcos con motoazada paguerd en la tienda de motoazadas y mulitas mecánicas agricolas.\nCon la ayuda de un surcos con motoazada paguerd, se puede apresurar el proceso de cultivo.\nUn surcos con motoazada paguerd es simple de manejar y maniobrar.\nAl invertir en surcos con motoazada paguerd, los labradores pueden liberar a sus trabajadores y delegar estas tareas en equipos mecánicos.\n🐳 Recomendaciones para exprimir las características de tu surcos con motoazada paguerd.\nA mucha gente le agrada la jardinería y para ello usa surcos con motoazada paguerd. Acá existen algunas cosas que deberías saber sobre ellos ya antes de comprar uno.\nA continuación le ofrecemos una lista de consejos y recomendaciones que debe tener en consideración ya antes de comprar un surcos con motoazada paguerd: El tamaño importa, los suelos arcillosos tienden a requerir más potencia que los suelos fangosos o areniscos y los modelos más potentes de cuatro tiempos pueden reemplazar a los tractores de arrastre para pequeñas parcelas.\n🤙🏻 Emplea tu surcos con motoazada paguerd de manera adecuada para prolongar la vida útil en buenas condiciones y protegerte de lesiones tanto a ti como a los tuyos.\nAsegúrate de que te tomas tu tiempo y manejas la surcos con motoazada paguerd como se debe. Esto evitará cualquiera de esas situaciones en las que no deseas estar.\nMotocultor para hacer surcos - Mejores precios e increibles características.\nSurcos con motoazada Piva - Precios baratos y las mejores características.\nSurcos con motoazada - Mejores precios y características.\nSurcos con motocultor Honda - Precios económicos y características.\nMotoazada para hacer surcos - Precios reducidos y las mejores características.\nSurcos para sembrar motoazada - Precios reducidos y magníficas características.\nBricor motocultores conaccesorio para hacer surcos - Precios reducidos y características.\nMulas mecánicas con con adaptador para hacer surcos - Excelentes precios y las mejores características.\nSurcos con motocultor - Precios reducidos y magníficas características.\nMejores motoazada eléctrica - Excelentes precios y magníficas características.


Una vez creada la BD podemos pedirle a MySQL que nos muestre todas las BD existentes. Para eso utilizamos la siguiente instrucción: - PDF\nDownload "Una vez creada la BD podemos pedirle a MySQL que nos muestre todas las BD existentes. Para eso utilizamos la siguiente instrucción:"\nVíctor Gutiérrez Chávez\n1 Guía de MySQL\n2 Contenidos: 1.- Introducción: 2.- Creación de una base de datos. CREATE DATABASE. 3.- Creación de una tabla y mostrar sus campos (CREATE TABLE - SHOW TABLES - describe - DROP TABLE) 4.- Instrucción ALTER TABLE. 5.- Carga de registros a una tabla y su recuperación (INSERT INTO SELECT) 6.- Tipos de datos básicos de un campo de una tabla 7.- Recuperación de algunos campos (SELECT) 8.- Recuperación de registros específicos (SELECT - WHERE) 9.- Operadores Relacionales = <> < <= > >= 10.- Borrado de registros de una tabla (DELETE) 11.- Modificación de registros de una tabla (UPDATE) 12.- Clave primaria 13.- Campo entero con autoincremento 14. Clave Foránea Comando TRUNCATE TABLE 18.- Valores NULL 19.- Valores numéricos sin signo (UNSIGNED) 20.- Tipos de datos 19.- Tipos de datos (texto) 20.- Tipos de datos (numéricos) 21.- Tipos de datos (fechas y horas) 22.- Valores por defecto 23.- Valores Inválidos 24.- Atributo DEFAULT en una columna de una tabla 25.- Atributo ZEROFILL en una columna de una tabla Columnas calculadas 27.- Funciones para el manejo de cadenas 28.- Funciones matemáticas 29.- Funciones para el uso de fecha y hora 30.- Cláusula ORDER del SELECT 31.- Operadores Lógicos (AND - OR - NOT) 32.- Otros operadores relacionales (BETWEEN - IN) 33.- Búsqueda de patrones (LIKE y NOT LIKE) 34.- Búsqueda de patrones (REGEXP) 35.- Contar registros (COUNT) 36.- Funciones de agrupamiento (COUNT - MAX - MIN - SUM - AVG) 37.- Agrupar registros (GROUP BY) 38.- Selección de un grupo de registros (HAVING) 39.- Registros duplicados (DISTINCT) 40.- Consulta a varias Tablas: INNER JOIN\n3 1.- Introducción: SQL: Structure Query Language (Lenguaje de Consulta Estructurado). MySQL es un sistema de administración de bases de datos (Database Management System, DBMS) para bases de datos relacionales open source y está haciendo un competidor cada vez más directo de gigantes en la materia de las bases de datos como ORACLE. Así que, MySQL es una aplicación que permite gestionar archivos llamados de bases de datos. Existen muchos tipos de bases de datos, desde un simple archivo hasta sistemas relacionales orientados a objetos. MySQL, como base de datos relacional, utiliza múltiples tablas para almacenar y organizar la información. MySQL fue escrito en C y C++ y destaca por su gran adaptación a diferentes entornos de desarrollo, permitiendo su interacción con los lenguajes de programación más utilizados como PHP, Perl y Java y su integración en distintos sistemas operativos. También es muy destacable, la condición de open source de MySQL, que hace que su utilización sea gratuita e incluso se pueda modificar con total libertad, pudiendo descargar su código fuente. Esto ha favorecido muy positivamente en su desarrollo y continuas actualizaciones, para hacer de MySQL una de las herramientas más utilizadas por los programadores orientados a Internet. Este permite crear base de datos y tablas, insertar datos, modificarlos, eliminarlos, ordenarlos, hacer consultas y realizar muchas operaciones. Ingresando instrucciones en la línea de comandos o embebidas en un lenguaje como PHP nos comunicamos con el servidor. 2.- Creación de una Base de datos: CREATE DATABASE Para comenzar a trabajar con una base de datos debemos conocer en primer lugar la definición: Una base de datos es un gran contenedor de información almacenada de forma organizada tal que se pueda evitar la redundancia de datos y se pueda establecer relaciones entre los mismos. La base de datos contendrá las tablas identificadas con un nombre único donde se guardarán los datos también identificados de forma única. Para crear una base de datos utilizamos la siguiente sintaxis SQL: CREATE DATABASE tienda; Con este query estamos creando la base de datos tienda. Nótese que las palabras CREATE y DATABASE están escritas en mayúsculas pues semánticamente es lo correcto. Se debe distinguir las palabras reservadas de SQL y las que como programadores estamos asignando a nuestros elementos. Al final de cada instrucción debe escribirse ; ya que este símbolo garantiza el fin de la instrucción. Una vez creada la BD podemos pedirle a MySQL que nos muestre todas las BD existentes. Para eso utilizamos la siguiente instrucción: SHOW DATABASES; Debe mostrarse una pantalla con el listado de las bd existentes para el momento tal y como lo muestra la siguiente imagen:\n4 Bases de datos existentes en el sistema. Para comenzar a trabajar con una base de datos se debe seleccionar para garantizar que todas las instrucciones se realicen dentro de la misma. Con la siguiente instrucción podemos hacer esa selección. USE tienda; Listo ya tenemos seleccionada la base de datos tienda. 3.- Creación de una tabla y mostrar sus campos (CREATE TABLE - SHOW TABLES - DESCRIBE - DROP TABLE) Una base de datos almacena sus datos en tablas. Esta es una estructura de datos que organiza los datos en columnas y filas; cada columna es un campo (o atributo) y cada fila, un registro. La intersección de una columna con una fila, contiene un dato específico, un solo valor. Cada registro contiene un dato por cada columna de la tabla. Cada campo (columna) debe tener un nombre. El nombre del campo hace referencia a la información que almacenará. Cada campo (columna) también debe definir el tipo de dato que almacenará. Cedula Nombre Apellido Cargo Tiempo_servicio Mario Perez Administrador Maria Garcia Gerente Diego Rodriguez Vendedor 2 Gráficamente acá tenemos la tabla empleados, que contiene cuatro campos llamados: cedula, nombre, apellido y cargo. Luego tenemos tres registros almacenados en esta tabla, el primero almacena en el campo cedula con el valor , seguido por el campo nombre con el valor "Mario", el campo apellido con el valor Perez y en el campo cargo con el valor " Administrador", y así sucesivamente con los otros dos registros. Al crear una tabla debemos resolver qué campos (columnas) tendrá y que tipo de datos almacenarán cada uno de ellos, es decir, su estructura. La tabla debe ser definida con un nombre que la identifique y con el cual accederemos a ella. Creamos una tabla llamada "empleados", tipeamos:\n5 CREATE TABLE empleados ( ); cedula INT(8), nombre VARCHAR(30), apellido VARCHAR(30), cargo VARCHAR(30), tiempo_servicio INT; Si intentamos crear una tabla con un nombre ya existente (existe otra tabla con ese nombre), mostrará un mensaje de error indicando que la acción no se realizó porque ya existe una tabla con el mismo nombre. Para ver las tablas existentes en una base de datos tipeamos: SHOW TABLES; Cuando se crea una tabla debemos indicar su nombre y definir sus campos con su tipo de dato. En esta tabla "empleados" definimos 4 campos: - cedula: que contendrá una cadena de caracteres numérica, con longitud 8 (hasta 8 caracteres numéricos). - nombre: que contendrá una cadena de hasta 30 caracteres de longitud, que almacenará el nombre del empelado - nombre: que contendrá una cadena de hasta 30 caracteres de longitud, que almacenará el apellido del empleado - cargo: otra cadena de caracteres de longitud 30, que guardará el nombre del cargo del empleado. - tiempo_servicio: cadena de caracteres numéricos sin longitud definida que guardara los años de servicio del empleado. Cada empleado ocupará un registro de esta tabla, con su respectiva cedula, nombre, apellido, cargo y tiempo_servicio. Para ver la estructura de una tabla usamos el comando "DESCRIBE" junto al nombre de la tabla: DESCRIBE empleados; Aparece lo siguiente: Estructura de la tabla empleados. Esta es la estructura de la tabla empleados ; nos muestra cada campo, su tipo, lo que ocupa en bytes y otros datos como la aceptación de valores nulos etc, Para eliminar una tabla usamos: DROP TABLE empleados;\n6 Si tipeamos nuevamente: DROP TABLE empleados; Aparece un mensaje de error, indicando que no existe, ya que intentamos borrar una tabla inexistente. Para evitar este mensaje podemos tipear: DROP TABLE IF EXISTS empleados; En la sentencia precedente especificamos que elimine la tabla empleados si existe. También podemos utilizar la instrucción DROP para eliminar una BD DROP DATABASE nombre_base_de_datos; nombre_base_de_datos es referente al nombre de la bd que queremos borrar. 4-. Instrucción ALTER TABLE: La instrucción ALTER TABLE permite modificar la estructura de una tabla existente, Podemos agregar o eliminar columnas, agregar o eliminar índices, modificar el tipo de columna (tipo de dato), renombrar las columnas y renombrar la tabla. ALTER TABLE crea una copia de la original y realiza los cambios sobre esta copia, luego la tabla original se borra y es renombrada la nueva tabla (la tabla copia.). Cabe destacar que mientras se ejecuta el ALTER TABLE, otros clientes pueden visualizar la original sin presentar cambio alguno. Aplicaremos a manera de ejemplo ciertos cambios a la tabla empleados. Comando a utilizar: Eliminar varias columnas específicas en una sola instrucción: ALTER TABLE empleados DROP COLUMN tiempo_servicio, DROP COLUMN apellido; En la instrucción anterior DROP COLUMN anticipa el nombre de la columna que se desea borrar Renombrar una columna: ALTER TABLE empleados CHANGE cargo cargo_em VARCHAR(30); En esta instrucción especificamos el nombre actual de la columna seguido del nuevo nombre y el tipo de columna, cargo lo identificamos como el nombre de la columna que queremos modificar y cargo_em el nuevo nombre. 4.3 Cambiar el tipo de datos de una columna sin renombrarla: ALTER TABLE empleados MODIFY cargo_em INT NOT NULL; En esta instrucción estamos especificando la columna a la cual le cambiaremos el tipo. Escribimos el nombre de la columna seguido del nuevo tipo. Podemos incluir atributos. 4.4 Agregar una nueva columna: ALTER TABLE empleados ADD tiempo_servicio INT; 4.5 Agregar una nueva columna indicándole la posición: ALTER TABLE empleados ADD direccion VARCHAR(100) AFTER apellido;\n7 Podemos sustituir AFTER por FIRST para colocar la nueva columna de primera. 4.6 Renombrar una tabla: ALTER TABLE empleados RENAME empleado. Necesitamos escribir el nombre de la columna actual, seguido por la palabra reservada RENAME y finalmente el nuevo nombre de la tabla. 5.- Carga de registros a una tabla y su recuperación (INSERT INTO SELECT) Un registro es una fila de la tabla que contiene los datos propiamente dichos. Cada registro tiene un dato por cada columna. Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el orden de los campos. Ahora vamos a agregar un registro a la tabla: INSERT INTO empleados (cedula, nombre, apellido, cargo, tiempo_servicio) VALUES ( , Mario, Perez, Administrador,4); Usamos INSERT INTO. Especificamos los nombres de los campos entre paréntesis y separados por comas y luego los valores para cada campo, también entre paréntesis y separados por comas. La tabla usuarios ahora la podemos representar de la siguiente forma: cedula nombre apellido cargo Tiempo_servicio Mario Perez Administrador 4 Es importante ingresar los valores en el mismo orden en que se nombran los campos, si ingresamos los datos en otro orden, nos aparece un mensaje de error y los datos se guardan de modo incorrecto o simplemente no llegan a guardarse. Note que los datos ingresados, como corresponden a campos de cadenas de caracteres se colocan entre comillas simples. Las comillas simples son OBLIGATORIAS, mientras que los datos numéricos podemos escribirlos sin o con comillas. Para ver los registros de una tabla usamos "SELECT": SELECT cedula, nombre, apellido, cargo, tiempo_servicio FROM empleados; El comando "SELECT" recupera los registros de una tabla. Luego del comando SELECT indicamos los nombres de los campos a rescatar. La instrucción anterior es equivalente a escribir: SELECT * FROM empleados; El asterisco (*) significa todos los campos de la tabla.\n8 6.- Tipos de datos básicos de un campo de una tabla Ya explicamos que al crear una tabla debemos resolver qué campos (columnas) tendrá y que tipo de datos almacenará cada uno de ellos, es decir, su estructura. Estos son algunos tipos de datos básicos: - VARCHAR: se usa para almacenar cadenas de caracteres. Una cadena es una secuencia de caracteres. Se coloca entre comillas (simples): 'Hola'. El tipo "VARCHAR" define una cadena de longitud variable en la cual determinamos el máximo de caracteres. Puede guardar hasta 255 caracteres. Para almacenar cadenas de hasta 30 caracteres, definimos un campo de tipo VARCHAR(30). Si asignamos una cadena de caracteres de mayor longitud que la definida, la cadena se corta. Por ejemplo, si definimos un campo de tipo VARCHAR(10) y le asignamos la cadena 'Buenas tardes', se almacenará 'Buenas tar' ajustándose a la longitud de 10 caracteres. - IINTEGER: se usa para guardar valores numéricos enteros, de a aprox. Definimos campos de este tipo cuando queremos representar, por ejemplo, cantidades. - FLOAT: se usa para almacenar valores numéricos decimales. Se utiliza como separador el punto (.). Definimos campos de este tipo para precios, por ejemplo. Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dato adecuado para cada uno de ellos. Por ejemplo, si en un campo almacenaremos números enteros, el tipo "FLOAT" sería una mala elección; si vamos a guardar precios, el tipo "FLOAT" es correcto, no así "INTEGER" que no tiene decimales. 7.- Recuperación de algunos campos (SELECT) Como vimos en el punto número 4. Para ver todos los registros de una tabla usamos la instrucción SELECT. Podemos especificar el nombre de los campos que queremos ver separándolos por comas: SELECT nombre, apellido FROM empleados; En la sentencia anterior la consulta mostrará sólo los campos "nombre" y "apellido". En la siguiente sentencia, veremos los campos correspondientes al cargo y cedula de todos los empleados: SELECT cargo, cedula FROM empleados; Como podemos ver podemos decidir incluso el orden en que se mostrarán los campos solicitados. 8.- Recuperación de registros específicos (SELECT - WHERE) Hemos aprendido cómo ver todos los registros de una tabla. Pero podemos aplicar ciertas condiciones para realizar una búsqueda más específica. Existe una cláusula, "WHERE" que es opcional, con ella podemos especificar condiciones para la consulta "SELECT". Es decir, podemos recuperar algunos registros, sólo los que cumplan con ciertas condiciones indicadas con la cláusula "WHERE". Por ejemplo, queremos ver el usuario cuyo nombre es "Mario", para ello utilizamos "WHERE" y luego de ella, la condición: SELECT nombre, apellido, cargo FROM empleados WHERE nombre='mario'; Para las condiciones se utilizan operadores relacionales. El signo igual (=) es un operador relacional. Para la siguiente selección de registros especificamos una condición que solicita los usuarios cuya cedula es igual a : SELECT nombre, apellido, cargo FROM empleados WHERE cedula= ;\n9 Si ningún registro cumple la condición establecida con el "WHERE", no devolverá ningún resultado. 9.- Operadores Relacionales = <> < <= > >= Hemos aprendido a especificar condiciones de igualdad para seleccionar registros de una tabla; por ejemplo: SELECT * FROM empleados WHERE apellido='perez'; Utilizamos el operador relacional de igualdad. Los operadores relacionales vinculan un campo con un valor para que MySQL compare cada registro (el campo especificado) con el valor dado. Los operadores relacionales son los siguientes: = igual <> distinto > mayor < menor >= mayor o igual <= menor o igual Podemos seleccionar los registros cuyo nombre sea diferente de 'Mario', para ello usamos la condición: SELECT nombre, apellido FROM empleados WHERE nombre<>'mario'; Podemos comparar valores numéricos. Por ejemplo, queremos mostrar los empleados cuyo tiempo de servicio sea mayor a 5 años: SELECT nombre, apellido FROM empleados WHERE tiempo_servicio>20; También, los empleados cuyo tiempo de servicio sea menor o igual a 10: SELECT nombre, apellido, tiempo_servicio FROM empleados WHERE tiempo_servicio<=10; 10.- Borrado de registros de una tabla (DELETE) Para eliminar los registros de una tabla usamos el comando "DELETE": DELETE FROM empleados; La ejecución del comando Indicado en la línea anterior borra TODOS los registros de la tabla. Si queremos eliminar uno o varios registros debemos Indicar cuál o cuáles, para ello utilizamos el comando "DELETE" junto con la cláusula "WHERE" con la cual establecemos la condición que deben cumplir los registros a borrar. Por ejemplo, queremos eliminar aquel registro cuyo nombre es 'Diego': DELETE FROM empleados WHERE nombre='diego'; Si solicitamos el borrado de un registro que no existe, es decir, ningún registro cumple con la condición especificada, no se borrarán registros, pues no encontró registros con ese dato. Por ejemplo:\n10 DELETE FROM empleados WHERE nombre='leonardo'; 11.- Modificación de registros de una tabla (UPDATE) Para modificar uno o varios datos de uno o varios registros utilizamos "UPDATE" (actualizar). Por ejemplo, en nuestra tabla "empleados", queremos cambiar los valores de todos los años de servicio, por "6": UPDATE empleados SET tiempo_servicio=6; Utilizamos "UPDATE" junto al nombre de la tabla y "set" junto con el campo a modificar y su nuevo valor. El cambio afectará a todos los registros. Podemos modificar algunos registros, para ello debemos establecer condiciones de selección con "WHERE". Por ejemplo, queremos cambiar el valor correspondiente al tiempo de servicio del empleado llamado 'Mario', queremos como nuevo tiempo de servicio 4, necesitamos una condición "WHERE" que afecte solamente a este registro: UPDATE empleados SET tiempo_servicio=4 WHERE nombre='mario'; Si no encuentra registros que cumplan con la condición del "WHERE", ningún registro es afectado. Las condiciones no son obligatorias, pero si omitimos la cláusula "WHERE", la actualización afectará a todos los registros. También se puede actualizar varios campos en una sola Instrucción: UPDATE empleados SET nombre='marcelo', tiempo_servicio=5 WHERE nombre='mario'; Para ello colocamos "UPDATE", el nombre de la tabla, "SET" junto al nombre del campo y el nuevo valor y separado por coma, el otro nombre del campo con su nuevo valor Clave primaria Una clave primaria es un campo (o varios) que identifica un solo registro (fila) en una tabla. Los valores en este caso no se repiten ni pueden ser nulos. Veamos un ejemplo, si tenemos una tabla con datos de personas, el número de cedula puede establecerse como clave primaria, es un valor que no se repite; puede haber personas con igual apellido y nombre, incluso el mismo domicilio (padre e hijo por ejemplo), pero su cédula será siempre distinto. Si tenemos la tabla "empleados", la cédula de cada empleado puede establecerse como clave primaria, es un valor que no se repite; puede haber usuarios con igual nombre, pero su cédula será siempre distinto. Establecemos que un campo sea clave primaria al momento de creación de la tabla: CREATE TABLE empleados ( cedula INT(8), nombre VARCHAR(30), apellido VARCHAR(30), cargo VARCHAR(30), tiempo_servicio INT; PRIMARY KEY(cedula) );\n11 Para definir un campo como clave primaria agregamos "PRIMARY KEY" luego de la definición de todos los campos y entre paréntesis colocamos el nombre del campo que queremos como clave. Si visualizamos la estructura de la tabla con "DESCRIBE" vemos que el campo "cedula" es clave primaria y no acepta valores nulos. Ingresamos algunos registros utilizando un INSERT múltiple: INSERT INTO empleados2 (cedula, nombre, apellido, cargo, tiempo_servicio) VALUES ( ,'Leonardo','Martinez', vendedor,6), ( ,'Jose','Bracho', Auxiliar,1), ( ,'Ana','Alvarado', Gerente,8); La inserción múltiple permite insertar todos los registros que queramos con una sola instrucción INSERT. La forma es la siguiente: 1. Entre cada paréntesis colocamos los datos del registro en el mismo orden en que aparecen los nombre de los campos. 2. Luego Separamos con coma (,) para comenzar el siguiente grupo de datos. Repetimos el paso anterior. 3. Al finalizar la escritura de los datos del último registro, colocamos (;) para finalizar la instrucción INSERT. Si intentamos ingresar un valor para el campo clave que ya existe, aparece un mensaje de error indicando que el registro no se cargó pues el dato clave existe. Esto sucede porque los campos definidos como clave primaria no pueden repetirse. Ingresamos un registro con una cédula de empleado existente, por ejemplo: INSERT INTO empleados2 (cedula, nombre, apellido, cargo, tiempo_servicio) VALUES ( , 'Gustavo','Andrade', Administrador,3); Cuál es el mensaje?... Una tabla sólo puede tener una clave primaria y esta puede ser de cualquier tipo, así mismo al establecer una clave primaria estamos Indexando la tabla, es decir, creando un índice para dicha tabla Campo entero con autoincremento Un campo de tipo entero puede tener otro atributo extra 'AUTO_INCREMENT'. Los valores de un campo 'AUTO_INCREMENT', se inician en 1 y se incrementan en 1 automáticamente. Se utiliza generalmente en campos correspondientes a códigos de identificación para generar valores únicos para cada nuevo registro que se inserta. Sólo puede haber un campo "AUTO_INCREMENT" y debe ser clave primaria (o estar indexado). Para establecer que un campo autoincremente sus valores automáticamente, éste debe ser entero (integer) y debe ser clave primaria: CREATE TABLE proveedores( codigo INT AUTO_INCREMENT, nombre VARCHAR(20), direccion VARCHAR(50),\n12 ); pago FLOAT, PRIMARY KEY(codigo) Para definir un campo auto incrementable colocamos "AUTO_INCREMENT" luego de la definición del campo al crear la tabla. Hasta ahora, al ingresar registros, colocamos el nombre de todos los campos antes de los valores; es posible ingresar valores para algunos de los campos de la tabla, pero recuerde que al ingresar los valores debemos tener en cuenta los campos que detallamos y el orden en que lo hacemos. Cuando un campo tiene el atributo "AUTO_INCREMENT" no es necesario ingresar valor para él, porque se inserta automáticamente tomando el último valor como referencia, o 1 si es el primero. Para ingresar registros omitimos el campo definido como "AUTO_INCREMENT", por ejemplo: INSERT INTO proveedores (nombre, dirección, pago) VALUES ('provee1','porlamar', 3000); Este primer registro ingresado guardará el valor 1 en el campo correspondiente al código. Si continuamos ingresando registros, el código (dato que no ingresamos) se cargará automáticamente siguiendo la secuencia de autoincremento. Está permitido ingresar el valor correspondiente al campo "auto_increment", por ejemplo: INSERT INTO proveedores (codigo, nombre, dirección, pago) VALUES (6, provee2','caracas, 34.56); Pero debemos tener cuidado con la inserción de un dato en campos "auto_increment". Debemos tener en cuenta que: - si el valor está repetido aparecerá un mensaje de error y el registro no se ingresará. - si el valor dado saltea la secuencia, lo toma igualmente y en las siguientes inserciones, continuará la secuencia tomando el valor más alto. - si el valor ingresado es 0, no lo toma y guarda el registro continuando la secuencia. - si el valor ingresado es negativo (y el campo no está definido para aceptar sólo valores positivos), lo ingresa. Para que este atributo funcione correctamente, el campo debe contener solamente valores positivos Clave Foránea o Clave Referenciada: Las claves foráneas son referencias a registros de otras tablas estableciendo una relación entre ellas. La clave foránea apunta siempre a la clave primaria de la tabla a la cual hace referencia. Para trabajar con claves foráneas debemos establecer el tipo de tabla como InnoDB. Para continuar con el ejercicio anterior crearemos la tabla productos que serán todos los productos vendidos en la tienda. Suponiendo que la tienda es de artículos para computadoras creamos CREATE TABLE productos (codigo_p INT AUTO_INCREMENT, nombre VARCHAR(40), precio FLOAT, disponible INT, PRIMARY KEY(codigo_p));\n13 Analicemos ahora las estructuras que queremos relacionar: tenemos la tabla proveedores, y la tabla productos, los productos son adquiridos por medio de proveedor o un fabricante, en nuestro caso los fabricantes de los productos serán también proveedores de los mismos. Ahora debemos identificar los productos comprados a un determinado proveedor en nuestra tabla productos. La manera de identificarlos es recordando que en la tabla proveedores existe un código de proveedor que es clave primaria en dicha tabla, entonces replicamos la columna codigo de la tabla proveedores en la tabla productos con el nombre de codigo_provee, de esta manera estaríamos relacionando ambas tablas evitando la redundancia de datos. La columna codigo de la tabla proveedores y la columna codigo_provee de la tabla productos deben tener el mismo tipo de dato, es decir, sí codigo es INT entonces código_provee también es INT. Ahora bien si nos fijamos un poco lo que acabamos de establecer es una clave foránea en la tabla de productos que hace referencia a la clave primaria de la tabla productos. Como escribirla: Podemos borrar la tabla creada anteriormente y crearla de nuevo: CREATE TABLE productos (codigo_p INT AUTO_INCREMENT, codigo_provee INT, nombre VARCHAR(40), precio FLOAT, disponible INT, PRIMARY KEY(codigo_p), FOREING KEY(codigo_provee) REFERENCES proveedores(codigo)); FOREING KEY() encierra la columna que será clave foránea o referencial en la tabla productos, REFERENCES indica la tabla a la que hace referencia encerrando entre paréntesis el campo al que hace referencia, en nuestro caso REFERENCES proveedores(codigo) es el campo código de la tabla proveedores. Si intentáramos insertar un producto de un proveedor inexistente MySQL nos daría un error advirtiendo de que no existe dicha clave de proveedor. Esto nos muestra que primero debemos insertar registros en la tabla proveedores (tabla referencia) y luego en la tabla productos (tabla que toma la referencia). Insertamos algunos registros en la tabla productos: INSERT INTO productos (codigo_provee, nombre, precio,) VALUES (1, 'desktop', 3000), (1, 'desktop', 4500), (2, 'laptop', 3000); (3, 'laptop', 5000), (4, 'teclado', 500), (4, 'mouse', 300), (5, 'desktop', 5000), (6, 'desktop', 3200), (1, 'Monitor', 1000), (7, 'Monitor', 2000), (8, 'impresora', 3000),(9, 'impresora', 5000); Si quisiéramos cambiar el código del proveedor por un nuevo código, debemos tomar en cuenta que ésta columna aparece en la tabla de proveedores y la tabla de productos. Trabajar con clave foránea permite realizar acciones en cascada, es decir si cambiáramos el código del proveedor en la tabla proveedores automáticamente se cambiaría en la tabla productos y en todas las demás tablas que aparezca la referencia. Igualmente si borramos un proveedor automáticamente quedaría fuera de la tabla de productos. Para que una clave foránea pueda cumplir con estas características debemos agregar las siguientes instrucciones al momento de crear la tabla que tendrá clave foránea: ON DELETE CASCADE ON UPDATE CASCADE CREATE TABLE productos (codigo_p INT AUTO_INCREMENT, codigo_provee INT, nombre VARCHAR(40), precio FLOAT, disponible INT, PRIMARY KEY(codigo_p), FOREING KEY(codigo_provee) REFERENCES proveedores(codigo) ON DELETE CASCADE ON UPDATE CASCADE); Una tabla puede tener más de una clave foránea con los atributos anteriores. Para eso se escribe la primera clave foránea con sus atributos seguida de una coma (,) y la siguiente clave foránea con sus atributos.\n14 También podemos borrar una clave foránea que ya no necesitemos. Para eso necesitamos seguir los siguientes pasos: 1.- Debemos verificar el id asignado por MySQL a la clave foránea. Este es un id que asigna el sistema para identificar las claves foráneas que puedan existir en una misma tabla. Para poder visualizar dicho id utilizamos la siguiente instrucción: SHOW CREATE TABLE productos; Nos mostrará la siguiente información: Nota: En el caso de la imagen la tabla se llama artículos El óvalo naranja señala en donde se encuentra el id para la clave foránea del ejemplo en la imagen. Debemos tomar ese valor para el siguiente paso. 2.- Debemos escribir la siguiente sentencia tomando en cuenta el id de clave foránea a borrar: ALTER TABLE productos DROP FOREIGN KEY productos_ibfk_1; Al final de la sentencia estamos señalando cuál es la clave foránea a borrar perteneciente a la tabla productos. También podemos crear una clave foránea a una tabla ya existente. Para eso utilizamos la siguiente instrucción: ALTER TABLE productos ADD FOREIGN KEY(codigo_provee) REFERENCES proveedores(codigo) ON DELETE CASCADE ON UPDATE CASCADE; Es de notar que es prácticamente la definición de clave foránea que utilizamos en la creación de la tabla productos unas líneas arriba, pero combinada con la instrucción ALTER comando TRUNCATE TABLE Aprendimos que para borrar todos los registro de una tabla se usa "DELETE" sin condición "WHERE". También podemos eliminar todos los registros de una tabla con "TRUNCATE TABLE". Por ejemplo, queremos vaciar la tabla "proveedores", usamos: TRUNCATE TABLE proveedores; La sentencia "TRUNCATE TABLE" vacía la tabla (elimina todos los registros) y vuelve a crear la tabla con la misma estructura. La diferencia con "DROP TABLE" es que esta sentencia borra la tabla, "TRUNCATE TABLE" la vacía. La diferencia con "DELETE" es la velocidad, es más rápido "TRUNCATE TABLE" que "DELETE" (se nota cuando la cantidad de registros es muy grande) ya que éste borra los registros uno a uno. Otra diferencia es la siguiente: cuando la tabla tiene un campo "AUTO_INCREMENT", si borramos todos los registros con "DELETE" y luego ingresamos un registro, al cargarse el valor en el campo autoincrementable, continúa con la\n15 secuencia teniendo en cuenta el valor mayor que se había guardado; si usamos "TRUNCATE TABLE" para borrar todos los registros, al ingresar otra vez un registro, la secuencia del campo autoincrementable vuelve a iniciarse en 1. Por ejemplo, tenemos la tabla "proveedores" con el campo "codigo" definido "AUTO_INCREMENT", y el valor más alto de ese campo es "5", si borramos todos los registros con "DELETE" y luego ingresamos un registro sin valor de código, se guardará el valor "6"; si en cambio, vaciamos la tabla con "TRUNCATE TABLE", al ingresar un nuevo registro sin valor para el código, iniciará la secuencia en 1 nuevamente valores NULL Analizaremos la estructura de una tabla que vemos al utilizar el comando "DESCRIBE". Tomamos como ejemplo la tabla "proveedores": Field Type NULL Key DEFAULT codigo int(11) NO PRI auto_increment nombre varchar(20) YES (NULL) direccion varchar(50) YES (NULL) pago float YES (NULL) La primera columna indica el tipo de dato de cada campo. La segunda columna "NULL" especifica si el campo permite valores nulos; vemos que en el campo "codigo", aparece "NO" y en las demás "YES", esto significa que el primer campo no acepta valores nulos (porque es clave primaria) y los otros si los permiten. La tercera columna "Key", muestra los campos que son clave primaria; en el campo "codigo" aparece "PRI" (es clave primaria) y los otros están vacíos, porque no son clave primaria. La cuarta columna "DEFAULT", muestra los valores por defecto, esto es, los valores que MySQL ingresa cuando omitimos un dato o colocamos un valor inválido; para todos los campos, excepto para el que es clave primaria, el valor por defecto es "NULL". Vamos a explicar los valores nulos. "NULL' significa "dato desconocido" o "valor inexistente". No es lo mismo que un valor 0, una cadena vacía o una cadena literal "NULL". A veces, puede desconocerse o no existir el dato correspondiente a algún campo de un registro. En estos casos decimos que el campo puede contener valores nulos. Por ejemplo, en nuestra tabla de proveedores, podemos tener valores nulos en el campo "direccion" porque es posible que para algunos proveedores no le hayamos establecido una dirección definida. En contraposición, tenemos campos que no pueden estar vacíos jamás, por ejemplo, los campos que identifican cada registro, como los códigos de identificación, que son clave primaria. Por defecto, es decir, si no lo aclaramos en la creación de la tabla, los campos permiten valores nulos. Imaginemos que ingresamos los datos de un proveedor, para el cual aún no hemos definido el pago: INSERT INTO proveedores (nombre, direccion, pago) VALUES ('provee3', 'La Asuncion', NULL);\n16 Note que el valor "NULL" no es una cadena de caracteres, no se coloca entre comillas, puesto que es una palabra reservada. Si un campo acepta valores nulos, podemos ingresar "NULL" cuando no conocemos el valor. Los campos establecidos como clave primaria no aceptan valores nulos. Nuestro campo clave primaria, está definido "AUTO_INCREMENT"; si intentamos ingresar el valor "NULL" para este campo, no lo tomará y seguirá la secuencia de incremento. El campo "nombre", no debería aceptar valores nulos, para establecer este atributo debemos crear la tabla con la siguiente sentencia: CREATE TABLE proveedores( codigo INt auto_increment, nombre varchar(20) NOT NULL direccion varchar(50), pago FLOAT, PRIMARY KEY(codigo) ); Entonces, para que un campo no permita valores nulos debemos especificarlo luego de definir el campo, agregando "NOT NULL". POR defecto, los campos permiten valores nulos, pero podemos especificarlo igualmente agregando "NULL". Explicamos que "NULL" no es lo mismo que una cadena vacía o un valor 0 (cero). Para recuperar los registros que contengan el valor "NULL" en el campo "pago" no podemos utilizar los operadores relacionales vistos anteriormente: = (igual) y <> (distinto); debemos utilizar los operadores "is NULL" (es igual a NULL) y "is NOT NULL" (no es NULL): SELECT * FROM proveedores WHERE pago IS NULL; La sentencia anterior tendrá una salida diferente a la siguiente: SELECT * FROM proveedores WHERE pago=0; Con la primera sentencia veremos los proveedores cuyo pago es igual a "NULL" (desconocido); con la segunda, los proveedores cuyo pago es 0. Igualmente para campos de tipo cadena, las siguientes sentencias "SELECT" no retornan los mismos registros: SELECT * FROM proveedores WHERE direccion is NULL; SELECT * FROM proveedores WHERE direccion='' ''; Con la primera sentencia veremos los proveedores cuya dirección es igual a "NULL", con la segunda, los proveedores cuya dirección guarda una cadena vacía Valores numéricos sin signo (UNSIGNED) Otro atributo que permiten los campos de tipo numérico es "UNSIGNED". El atributo "UNSIGNED" (sin signo) permite sólo valores positivos. Si necesitamos almacenar edades, por ejemplo, nunca guardaremos valores negativos, entonces sería adecuado definir un campo "edad" de tipo entero sin signo: edad INT UNSIGNED;\n17 Si necesitamos almacenar el precio de los productos, definimos un campo de tipo "FLOAT UNSIGNED" porque jamás guardaremos un valor negativo. Hemos aprendido que al crear una tabla, es importante elegir el tipo de dato adecuado, el más preciso, según el caso. Si un campo almacenará sólo valores positivos, es útil definir dicho campo con este atributo. En los tipos enteros, "UNSIGNED" duplica el rango, es decir, el tipo "INTEGER" permite valores de a aprox., si se define "INTEGER UNSIGNED" el rango va de 0 a aprox Tipos de datos Hasta ahora hemos visto 3 tipos de datos: VARCHAR, INTEGER (con y sin signo) y FLOAT (con y sin signo). Hay más tipos, incluso, subtipos. Los valores que podemos guardar son: A) TEXTO: Para almacenar texto usamos cadenas de caracteres. Las cadenas se colocan entre comillas simples. Podemos almacenar dígitos con los que no se realizan operaciones matemáticas, por ejemplo, códigos de identificación, números de documentos, números telefónicos. Tenemos los siguientes tipos: VARCHAR, CHAR y TEXT. B) NUMEROS: Existe variedad de tipos numéricos para representar enteros, negativos, decimales. Para almacenar valores enteros, por ejemplo, en campos que hacen referencia a cantidades, precios, etc., usamos el tipo INTEGER. Para almacenar valores con decimales utilizamos: FLOAT o decimal. C) FECHAS Y HORAS: para guardar fechas y horas dispone de varios tipos: DATE (fecha), DATETIME (fecha y hora), TIME (hora), YEAR (año) y TIMESTAMP. D) OTROS TIPOS: ENUM y SET representan una enumeración y un conjunto respectivamente Tipos de datos (texto) Para almacenar TEXTO usamos cadenas de caracteres. Las cadenas se colocan entre comillas simples. Podemos almacenar dígitos con los que no se realizan operaciones matemáticas, por ejemplo, códigos de identificación, números de documentos, números telefónicos. Tenemos los siguientes tipos: 1) VARCHAR(x): define una cadena de caracteres de longitud variable en la cual determinamos el máximo de caracteres con el argumento "x" que va entre paréntesis. Su rango va de 1 a 255 caracteres. Un VARCHAR(10) ocupa 11 bytes, pues en uno de ellos almacena la longitud de la cadena. Ocupa un byte más que la cantidad definida. 2) CHAR(x): define una cadena de longitud fija, su rango es de 1 a 255 caracteres. Si la cadena ingresada es menor a la longitud definida (por ejemplo cargamos 'Juan' en un CHAR(10)), almacena espacios en blanco a la derecha, tales espacios se eliminan al recuperarse el dato. Un CHAR(10) ocupa 10 bytes, pues al ser fija su longitud, no necesita ese byte adicional donde guardar la longitud. por ello, si la longitud es invariable, es conveniente utilizar el tipo CHAR; caso contrario, el tipo VARCHAR. Ocupa tantos bytes como se definen con el argumento "x". Si ingresa un argumento mayor al permitido (255) aparece un mensaje indicando que no se permite y sugiriendo que use "BLOB" o "TEXT". Si omite el argumento, coloca 1 por defecto. 3) BLOB o TEXT: bloques de datos de caracteres de longitud aprox. Para los tipos que almacenan cadenas, si asignamos una cadena de caracteres de mayor longitud que la permitida o definida, la cadena se corta. Por ejemplo, si definimos un campo de tipo VARCHAR(10) y le asignamos la cadena 'Buenas tardes', se almacenará 'Buenas tar' ajustándose a la longitud de 10.\n18 Es importante elegir el tipo de dato adecuado según el caso, el más preciso. POR ejemplo, si vamos a almacenar un carácter, conviene usar CHAR(1), que ocupa 1 byte y no VARCHAR(1), que ocupa 2 bytes. Tipo Bytes de almacenamiento CHAR(x) x VARCHAR(x) x Tipos de datos (numéricos) Existe variedad de tipos numéricos para representar enteros, negativos, decimales. Para almacenar valores enteros, por ejemplo, en campos que hacen referencia a cantidades, precios, etc., usamos: 1) INTEGER(x) o INT(x): su rango es de a aprox. El tipo "INT UNSIGNED" va de 0 a El tipo "INTEGER" tiene subtipos: - MEDIUMINT(x): va de a aprox. SIN signo va de 0 a aprox. - SMALLINT(x): va de a aprox., sin signo, de 0 a aprox. - TINYINT(x): define un valor entero pequeño, cuyo rango es de -128 a 127. El tipo sin signo va de 0 a BOOL o BOOLEAN: sinónimos de TINYINT(1). Un valor cero se considera falso, los valores distintos de cero, verdadero. - BIGINT(x): es un entero largo. Va de a aprox. SIN signo es de 0 a Para almacenar valores con decimales utilizamos: 2) FLOAT (t,d): número de coma flotante. Su rango es de -3.4e+38 a 1.1e-38 (9 cifras). 3) DECIMAL o NUMERIC (t,d): el primer argumento indica el total de dígitos y el segundo, la cantidad de decimales. El rango depende de los argumentos, también los bytes que ocupa. Si queremos almacenar valores entre 0.00 y debemos definir el campo como tipo "decimal (4,2)". Si no se indica el valor del segundo argumento, por defecto es 0. Para los tipos "FLOAT" y "decimal" se utiliza el punto como separador de decimales. Todos los tipos enteros pueden tener el atributo "UNSIGNED", esto permite sólo valores positivos y duplica el rango. Los tipos de coma flotante también aceptan el atributo "UNSIGNED", pero el valor del límite superior del rango no se modifica. Es importante elegir el tipo de dato adecuado según el caso, el más preciso. POR ejemplo, si un campo numérico almacenará valores positivos menores a 10000, el tipo "INT" no es el más adecuado, porque su rango va de a aprox., conviene el tipo "SMALLINT UNSIGNED", cuyo rango va de 0 a aprox. De esta manera usamos el menor espacio de almacenamiento posible. Tipo Bytes de almacenamiento TINYINT 1 SMALLINT 2 MEDIUMINT 3 INT 4 BIGINT 8 FLOAT 4 DECIMAL(t,d) t+2 si d>0, t+1 si d=0 y d+2 si t<d\n19 21.- Tipos de datos (fechas y horas) Para guardar fechas y horas dispone de varios tipos: 1) DATE: representa una fecha con formato "YYYY-MM-DD". El rango va de " " a " ". 2) DATETIME: almacena fecha y hora, su formato es "YYYY-MM-DD HH:MM:SS". El rango es de " :00:00" a " :59:59". 3) TIME: una hora. Su formato es "HH:MM:SS". El rango va de "-838:59:59" a "838:59:59". 4) YEAR(2) y YEAR(4): un año. Su formato es "YYYY" o "YY". Permite valores desde 1901 a 2155 (en formato de 4 dígitos) y desde 1970 a 2069 (en formato de 2 dígitos). Si ingresamos los valores como cadenas, un valor entre "00" y "69" es convertido a valores "YEAR" en el rango de 2000 a 2069; si el valor está entre "70" y "99", se convierten a valores "YEAR" en el rango 1970 a Si ingresamos un valor numérico 0, se convierte en "0000"; entre 1 y 69, se convierte a valores "YEAR" entre 2001 a 2069; entre 70 y 99, es convertido a valores "YEAR" de 1970 a Para almacenar valores de tipo fecha se permiten como separadores "/", "-" y ".". Si ingresamos ' ' (año de 2 dígitos), lo toma como ' '. Si ingresamos ' ' (mes y día de 1 dígito), lo toma como ' '. Si ingresamos ' ' (cadena sin separador), lo toma como ' '. Si ingresamos (numérico), lo toma como ' '. Si ingresamos ' ' (cadena sin separadores), lo toma como ' :30:21'. Si ingresamos ' ' (cadena sin separadores con un dato faltante) no lo reconoce como fecha-hora y almacena ceros. Si ingresamos ' ' (cadena sin separadores con un dato faltante) no lo reconoce como fecha y almacena ceros. Si ingresamos ' :30:21' (valor date time) en un campo 'DATE', toma sólo la parte de la fecha, la hora se corta, se guarda ' '. Es importante elegir el tipo de dato adecuado según el caso, el más preciso. Por ejemplo, si sólo necesitamos registrar un año (sin día ni mes), el tipo adecuado es "YEAR" y no "date". Tipo bytes de almacenamiento DATE 3 DATETIME 8 TIME 3 YEAR valores por defecto Para campos declarados "NOT NULL", el valor por defecto depende del tipo de dato. Para cadenas de caracteres el valor por defecto es una cadena vacía. Para valores numéricos el valor por defecto es 0; en caso de ser "AUTO_INCREMENT"\n20 es el valor mayor existente+1 comenzando en 1. Para campos de tipo fecha y hora, el valor por defecto es 0 (por ejemplo, en un campo "date" es " "). Para todos los tipos, excepto "BLOB", "TEXT" y "AUTO_INCREMENT" se pueden explicitar valores por defecto con la cláusula "DEFAULT". Un valor por defecto se inserta cuando no está presente al ingresar un registro y en algunos casos en que el dato ingresado es inválido. Los campos para los cuales no se ingresaron valores tomarán los valores por defecto según el tipo de dato del campo, en el campo "codigo" ingresará el siguiente valor de la secuencia porque es "AUTO_INCREMENT"; en el campo "nombre", ingresará una cadena vacía porque es "VARCHAR NOT NULL"; en el campo "direccion" almacenará "NULL", porque no está definido "NOT NULL"; en el campo "pago" guardará "NULL" porque es el valor por defecto de los campos no definidos como "NOT NULL" y en el campo "cantidad" ingresará 0 porque es el valor por defecto de los campos numéricos que no admiten valores nulos. Tipo valor por defecto Cláusula "DEFAULT" caracter NOT NULL cadena vacía permite numerico NOT NULL 0 permite fecha NOT NULL permite hora NOT NULL 00:00:00 permite auto_increment siguiente de la sec., empieza en 1 no permite carac.,numer.,fecha,hora NULL NULL permite 23.- Valores Inválidos Un valor es inválido por tener un tipo de dato incorrecto para el campo o por estar fuera de rango. Veamos los distintos tipos de datos inválidos. Para campos de tipo carácter: - valor numérico: si en un campo definido de tipo caracter ingresamos un valor numérico, lo convierte automáticamente a cadena. Por ejemplo, si guardamos 234 en un VARCHAR, almacena '234'. - mayor longitud: si intentamos guardar una cadena de caracteres mayor a la longitud definida, la cadena se corta guardando sólo la cantidad de caracteres que quepa. Por ejemplo, si definimos un campo de tipo VARCHAR(10) y le asignamos la cadena 'Buenas tardes', se almacenará 'Buenas tar' ajustándose a la longitud de 10. Para campos numéricos: - Cadenas: si en un campo numérico ingresamos una cadena, lo pasa por alto y coloca 0. POR ejemplo, si en un campo de tipo "INTEGER" guardamos 'abc', almacenará 0. - Valores fuera de rango: si en un campo numérico intentamos guardar un valor fuera de rango, se almacena el valor límite del rango más cercano (menor o mayor). Por ejemplo, si definimos un campo 'TINYINT' (cuyo rango va de -128 a 127) e intentamos guardar el valor 200, se almacenará 127, es decir el máximo permitido del rango; si intentamos guardar -200, se guardará -128, el mínimo permitido por el rango. Otro ejemplo, si intentamos guardar el valor en un campo definido como decimal (5,2) guardará que es el mayor del rango. - Valores incorrectos: si cargamos en un campo definido de tipo decimal un valor con más decimales que los permitidos en la definición, el valor es redondeado al más cercano. Por ejemplo, si cargamos en un campo definido como decimal (4,2) el valor , se guardará 22.23, si cargamos se guardará Para campos definidos AUTO_INCREMENT el tratamiento es el siguiente:\n21 - Pasa por alto los valores fuera del rango, 0 en caso de no ser "UNSIGNED" y todos los menores a 1 en caso de ser "UNSIGNED". - Si ingresamos un valor fuera de rango continúa la secuencia. - Si ingresamos un valor existente, aparece un mensaje de error indicando que el valor ya existe. Para campos de fecha y hora: - valores incorrectos: si intentamos almacenar un valor que MySQLl no reconoce como fecha (sea fuera de rango o un valor inválido), convierte el valor en ceros (según el tipo y formato). Por ejemplo, si intentamos guardar '20/07/2006' en un campo definido de tipo "DATE", se almacena ' '. Si intentamos guardar '20/07/ :30' en un campo definido de tipo "DATETIME", se almacena ' :00:00'. Si intentamos almacenar un valor inválido en un campo de tipo "TIME", se guarda ceros. Para "TIME", si intentamos cargar un valor fuera de rango, se guarda el menor o mayor valor permitido (según sea uno u otro el más cercano). Para campos de cualquier tipo: - valor "NULL": si un campo está definido "NOT NULL" e intentamos ingresar "NULL", aparece un mensaje de error y la sentencia no se ejecuta. Los valores inválidos para otros tipos de campos lo trataremos más adelante. Resumen: Tipo valor inválido resultado caracter NULL/ NOT NULL 123 '123' caracter NULL/ NOT NULL mayor longitud se corta caracter NOT NULL NULL error numérico NULL/ NOT NULL '123' 0 numérico NULL/ NOT NULL fuera de rango límite más cercano numérico NOT NULL NULL error numérico decimal NULL/ NOT NULL más decimales que los definidos redondea al más cercano num. auto_incr. c/signo NULL/NOT NULL 0 siguiente de la secuencia num. auto_incr. s/signo NULL/NOT NULL todos los menores a 1 siguiente de la secuencia num. auto_incr. c/s signo NULL NULL siguiente de la secuencia num. auto_incr. c/s signo NULL/NOT NULL valor existente error fecha fuera de rango fecha ' ' (otro orden) hora fuera de rango límite más cercano fecha y hora NOT NULL NULL error 24.- Atributo DEFAULT en una columna de una tabla Si al insertar registros no se especifica un valor para un campo, se inserta su valor por defecto implícito según el tipo de dato del campo. Por ejemplo: INSERT INTO proveedores (nombre, direccion, pago) VALUES ('provee4', 'Maracaibo', 25.7); Como no ingresamos valor para el campo "codigo", mysql insertará el valor por defecto, como "codigo" es un campo "AUTO_INCREMENT", el valor por defecto es el siguiente de la secuencia. Si omitimos el valor correspondiente al nombre:\n22 INSERT INTO proveedores (direccion, pago) VALUES ('Maracaibo', 25.7); MySQL insertará "NULL", porque el valor por defecto de un campo (de cualquier tipo) que acepta valores nulos, es "NULL". Lo mismo sucede si no ingresamos el valor del pago: INSERT INTO proveedores (nombre, direccion) VALUES ('provee10','valencia'); MySQL insertará el valor "NULL" porque el valor por defecto de un campo (de cualquier tipo) que acepta valores nulos, es "NULL". Podemos establecer valores por defecto para los campos cuando creamos la tabla. Para ello utilizamos "DEFAULT" al definir el campo. POR ejemplo, queremos que el valor por defecto del campo "pago" sea 1.11 y el valor por defecto del campo "direccion" sea "Desconocido": CREATE TABLE proveedores2( codigo INt UNSIGNED AUTO_INCREMENT, nombre varchar(40) NOT NULL, direccion varchar(50) DEFAULT 'Desconocido', pago decimal(5,2) UNSIGNED DEFAULT 1.11, PRIMARY KEY(codigo) ); Si al ingresar un nuevo registro omitimos los valores para el campo "nombre" y "pago", MySQL insertará los valores por defecto definidos con la palabra clave "DEFAULT": INSERT INTO proveedores (nombre) VALUES ('prove11'); MySQL insertará el registro, con nombre prove11, en nombre colocará "Desconocido" y en pago "1.11". Entonces, si al definir el campo explicitamos un valor mediante la cláusula "DEFAULT", ése será el valor por defecto; sino insertará el valor por defecto implícito según el tipo de dato del campo. Los campos definidos "AUTO_INCREMENT" no pueden explicitar un valor con "DEFAULT", tampoco los de tipo "BLOB" y "TEXT". Los valores por defecto implícitos son los siguientes: - para campos de cualquier tipo que admiten valores nulos, el valor por defecto "NULL"; - para campos que no admiten valores nulos, es decir, definidos "NOT NULL", el valor por defecto depende del tipo de dato: - para campos numéricos no declarados "AUTO_INCREMENT": 0; - para campos numéricos definidos "AUTO_INCREMENT": el valor siguiente de la secuencia, comenzando en 1; - para los tipos cadena: cadena vacía. Ahora al visualizar la estructura de la tabla con "describe" podemos entender un poco más lo que informa cada columna: DESCRIBE proveedores; "Field" contiene el nombre del campo; "Type", el tipo de dato; "NULL" indica si el campo admite valores nulos; "Key" indica si el campo está indexado (lo veremos más adelante); "DEFAULT" muestra el valor por defecto del campo y "Extra" muestra información adicional respecto al campo, por ejemplo, aquí indica que "codigo" está definido "AUTO_INCREMENT". También se puede utilizar "DEFAULT" para dar el valor por defecto a los campos en sentencias "INSERT", por ejemplo:


Vara reconoce trabajo de Ábalos para sacar adelante proyecto Alta Velocidad en Extremadura\nInicio / Portada / Vara reconoce trabajo de Ábalos para sacar adelante proyecto Alta Velocidad en Extremadura\nEl presidente de la Junta considera que éste ha sido “junto con Íñigo de la Serna, el único ministro que se ha tomado en serio esta tierra”.\nEn concreto, el jefe del Ejecutivo regional, que ha sido el encargado de presentar a José Luis Ábalos en un desayuno informativo organizado por El Periódico Extremadura en la ciudad de Badajoz, ha dicho de éste que ha sido “junto con Íñigo de la Serna, el único ministro que se ha tomado en serio esta tierra”.\nY es que, tal y como ha recalcado, además de “palabras”, ha puesto dinero para que el tramo del AVE extremeño pueda salir adelante.\nEn este sentido, el máximo mandatario extremeño ha recordado los más de 600 millones de euros que se han licitado “solo en el último año”, y que van a permitir que esas obras se puedan terminar.\nA su vez, Fernández Vara ha insistido en que “aquí hemos oído de todo” y que “las culpas están muy repartidas”, en referencia a los muchos ministros “repartidos entre unos y otros partidos” que “fallaron” a esta región, algo que no ha ocurrido con José Luis Ábalos.\nIgualmente, el presidente autonómico ha contado al público asistente que cuando se produjeron los primeros incidentes en los trenes extremeños tras la toma de posesión de Ábalos como ministro, éste le prometió que se iban a cambiar los trenes y le aseguró que las obras del tramo extremeño del AVE se iban a terminar.\nPasados 13 meses desde esa conversación, Vara ha afirmado que Ábalos, “además de predicar, dio trigo” porque su trabajo ha hecho posible que los viernes el Consejo de Ministros y los fines de cada mes los consejos de Administración de RENFE y de ADIF hayan tomado las decisiones para que el tramo Badajoz-Plasencia vaya a ser “una realidad”, tal y como informa la Junta en una nota de prensa.\nAl mismo tiempo, esas decisiones han permitido cambiar los trenes y reducir el número de incidentes, tal y como ha subrayado.\nEn esta línea, Fernández Vara ha agradecido también al ministro de Fomento que su departamento haya aceptado asumir la titularidad de la carretera que une Cáceres y Badajoz (antigua EX100 y actual N-523) para convertirla en autovía, unas gestiones que se llevaron a cabo en un plazo de un mes.\nA colación de esto último, el jefe del Ejecutivo regional ha puntualizado que “nadie nos está regalando nada” y ha insistido en que el Estado tiene “una deuda histórica” con Extremadura que no quedará saldada hasta que los extremeños puedan tener unas comunicaciones con Madrid en iguales condiciones a las de los ciudadanos de otras regiones.\nA este respecto, ha abundado en que “no queremos ser más que nadie pero tampoco menos” y ha anunciado que dentro de unos años, cuando se haya hecho realidad ese “no ser menos que nadie”, habrá que recordar la aportación “de un ministro como José Luis Ábalos”, ha concluido.


Se lanzó la licitación para la ampliación y optimización del Subsistema Cloacal Rawson y Cerrillo Barboza - Estación Claridad\nSe lanzó la licitación para la ampliación y optimización del Subsistema Cloacal Rawson y Cerrillo Barboza\nLa puesta en marcha de esta obra, que involucra a Pocito norte, Rawson noroeste y Rivadavia sureste, beneficiará a 39.722 habitantes.\nBajo un plan de gestión integral de descarga de líquidos cloacales denominado «Sistema Integral de Desagües Cloacales del Gran San Juan», se abrió la Licitación Pública Nacional Nº 2661/2021 para poner en marcha la obra de ampliación y optimización del Subsistema Cloacal Rawson y Planta de Tratamiento de Líquidos Cloacales Cerrillo Barboza.\nDicha obra, se ejecutará con fondos nacionales, provenientes del Ente Nacional de Obras Hídricas de Saneamiento – Ministerio de Obras Públicas Argentina; y contempla la instalación de redes colectoras donde descargarán los líquidos cloacales de los sectores Pocito Norte, Rawson Noroeste y Rivadavia Sureste, con un plazo de ejecución: 720 días corridos.\nA su vez, se programa ampliar la capacidad de tratamiento de la Planta de Tratamiento de Líquidos Cloacales «Cerrillo Barboza», el cual fue inaugurado en 2009 y está diseñado para depurar los líquidos provenientes del Gran San Juan mediante el método de Lagunas Facultativas.\nLa obra proyecta ampliar una serie de lagunas complementarias (Primaria, Secundaria y Terciaria) para realizar el correcto tratamiento biológico, y además, realizar mejoras y optimizaciones en la Planta de Tratamiento de líquidos Cloacales.


Las malas noticias se darán con una sonrisa en un cabaret\nLas mejores obras del 22 de mayo al 13 de junio La obra contará con 200 ejemplares de 'Diario de Almería'\nEl Teatro Municipal acoge hoy, a las 23:00 horas, la representación de 'Dudual News' a cargo de La Butaca Roja. 'Diario de Almería' estará presente en la obra\nFran Murcia / El Ejido 06 Junio, 2009 - 01:00h\nCon el juego del rojo y el negro, el cabaret tomará forma hoy en el Teatro Municipal, a las 23:00 horas, en un cabaret donde sonará música en directo y mucho humor para representar Dudual News a cargo de La Butaca Roja.\nLas malas noticias pueden darse de muchas formas y las connotaciones pueden variar según el tratamiento que se le ofrezca. Los dos protagonistas de la obra piensan que una noticia se puede dar con una sonrisa y, aún más, con una carcajada.\nLos protagonistas se preguntan: ¿Por qué un debate entre Mariano Rajoy y José Luis Rodríguez Zapatero no puede ir acompañado por una canción de Pimpinela? ¿Algún comunicado de Rouco Varela no puede ir con El Rey del glam, de Alaska?\nLos dos protagonistas de la representación de Dudual News son Juanjo Macías y Paz de Alarcón. No es la primera vez que los intérpretes visitan el municipio ejidense.\nCon un tacón de aguja y los ojos pintados, con una línea negra al más puro estilo del cabaret más canalla, los intérpretes contarán las noticias del mismo día de la representación. Noticias frescas, improvisadas, música en directo, canciones, coreografías y mucho humor serán los ingredientes que se mezclarán en la coctelera de la interpretación.\nUna nueva forma de informar llegará al Teatro Municipal donde los números de cabaret y el humor se desarrollarán durante los setenta minutos que dura la representación.\nLa dirección corre a cargo de Estrella Távora y la dramaturgia y selección de la obra la realizan los mismos actores que la representan.\nJuan jo Macías tiene una carrera dilatada. Comienza en la profesión en el mundo del teatro y ha ganado varios galardones por su papel interpretativo. En Televisión, comenzó su andadura con Rafaella Carrá y realizó varios personajes en las fiestas de fin de año de Canal Sur. También fue uno de los componentes de La Banda del Sur.\nPaz de Alarcón tiene una intensa formación en las artes escénicas y ha participado en el mundo del cine.\nEn la obra, habrá 200 ejemplares aproximadamente de Diario de Almería para ser la víctima perfecta del espectáculo de cabaret que se realizará en el Teatro Municipal.\nUna forma distinta de ver una obra de cabaret y de informarse de los sucesos que pasan en la realidad más cercana de la provincia de Almería. Las noticias a ritmo de carcajada.


November | 2012 | Collage\nNovember 13, 2012 Avacyn\tDecoración\tLeave a comment\nLos primeros indicios de Jardines Japoneses surgieron en el período Nara (710-794 d.c.) dentro del Palacio Imperial. El nacimiento del “Jardín Zen” está basado en la necesidad de crear un espacio que fuese utilizado como una ayuda para la meditación.\nDurante este período, las parcelas de tierra fueron pequeñas y sus estanques diseñados a una escala menor.\nEs por ello, que para inducir la sensación de grandes ambientes en espacios pequeños se requirió representar el paisaje natural mediante la combinación monocromática de todos sus elementos.\nComo resultado nació el jardín Zen tipo “escenario,” el cual fue más sofisticado con la incorporación de intrincadas líneas costeras en las orillas de sus estanques y mediante el uso de rocas en varias formas.\nLuego, durante el período Muromachi (1392-1573) el zen se popularizó entre los Samurái como una disciplina necesaria para realizar la acción correcta en momentos difíciles.\nEl jardín tipo “paisaje seco” (kare-sansui), realizado con rocas y arena en estrechos espacios ubicados frente a los cuartos de meditación comenzó a aparecer en los Templos.\nSin el uso de agua, la arena y las rocas simularon su presencia en forma de ríos o ambientes oceánicos.\nEn el jardín japonés se expresa espiritualidad, en el sentido de que en él no hay riqueza material, sino la pureza de cosas simples y austeras.\nLos elementos son sólo objetos naturales y que mediante su perfecta colocación hacen que el jardín se convierta en una obra para la contemplación.\nComo trabaja el Jardín Zen\nFuerza de voluntad – Para todo lo que necesitamos hacer, requerimos esta fuerza de donde emanan las ideas, los objetivos, las metas.\nMisericordia – En todos nuestros actos y pensamientos.\nCreación – Llevar a cabo las cosas sin dejarlas a medias, no quedarse en él hubiera, sino tener la satisfacción de hacer el intento.\nBelleza – Seguir el ejemplo de la naturaleza y las cualidades del equilibrio percibir la belleza interna tanto como la externa.\nTolerancia – Ser benevolente en los juicios, utilizar la paciencia y el respeto hacia todo lo existente.\nPerdón – No guardar rencores, comprender que cada quien tiene su etapa de evolución, nadie es perfecto.\nFormación – Normar nuestro criterio, aprendiendo de todo lo que se nos presenta, estar atentos y abiertos para recibir los mensajes.\nConocimiento- Actuar con humildad, nunca se sabe suficiente.\nActualmente se utiliza como auxiliar para equilibrar nuestra energía mediante su contemplación y también al rastrillarlo.\nAl contemplar el Jardín Zen en momentos de ansiedad podemos sumergirnos en otra realidad en la cual todo está como tiene que estar.\nUsted puede utilizar el acto de rastrillar la arena para fijar sus emociones, una herramienta poderosa para crear las situaciones que queremos vivir o cambiar las que no nos hacen plenos.\nUbique el Jardín Zen en su mesa o en el trabajo, y disfrute de sus propiedades y tranquila belleza.”\nPara disfrutar de una agradable sensación de paz y bienestar, hay que respirar profunda y lentamente mientras se rastrilla la arena dibujando finas líneas, círculos o figuras.\nEl jardín puede convertirse en un espacio de cambio permanente donde se pueden añadir o retirar elementos, recolocar las piedras, alisar determinadas zonas o trazar nuevos surcos, dejando que nuestro espíritu se exprese libremente.\nLos dibujos estimulan la creatividad personal y, en todos los casos, estos jardines pueden “funcionar” como un sencillo juego anti estrés.\nUna vez colocados los diferentes elementos, el jardín es una obra para la contemplación.\nEl Jardín Zen le permite descansar a nuestra mente, concentrarla en un solo punto, tranquilizar la ansiedad ,la angustia y los medios, podemos cambiar su forma infinidad de veces retirando las rocas, alisando la arena, colocando nuevamente todos los elementos y trazando los surcos que representan nuevas oportunidades, para continuar en nuestro sendero, resulta muy ameno, cautivante, relajante, resulta ser una herramienta de terapia mental, al mismo tiempo que es una expresión profunda de nuestro ser interior, nos da la oportunidad de renovarnos conociendo cada experiencia por la cual hemos pasado.\nUn Jardín Zen miniatura puede crear una sensación de espacio en tu hogar u oficina, e introducir un sentido de orden en tu espíritu y un sentimiento de tranquilidad y de calma.\nLos jardines pueden ser un medio para ayudarte a descubrir la fuente del ser humano natural, en la cual se apoya la enseñanza del Zen, un ser humano calmo, sincero y capaz de hacer frente a todos los avatares de la vida con serenidad y calma perfecta.\nEste pequeño jardín Zen te anima a que crees un clima equilibrado. Refleja tus sensaciones internas a través de los diseños y patrones que dibujas con el rastrillo. Cuando son pequeñas, las cosas adquieren una resonancia más grande. El jardín traerá calma a tus nervios, dejará flotar tu mente, endulzará tu alma, o como un libro, te hablará a lo más profundo de tu secreta naturaleza.\nPara el japonés este jardín es un instrumento de meditación y relajación. Los occidentales lo miramos más bien como un mitigador de la tensión. Los jardines miniatura japoneses están realizados para bajar el nivel de tensión y promueven una salud mejor.\nBambú de la suerte para decorar\nEl bambú de la suerte es una de las plantas de interior más fácil de cultivar que hay y también una de las más vistosas, pues un jarrón con el bambú a modo de decoración siempre le da un toque sofisticado al rincón donde esté expuesta. Tal vez se deba al aspecto pulcro y estilizado de la planta.\nPara cuidar nuestro bambú de la suerte tenemos que tener cuidado con la temperatura, ya que el calor no lo lleva muy bien, aunque es bastante resistente una vez ha salido adelante. El otro factor indispensable para tener una planta sana es comprender sus necesidades acuáticas. En el caso del bambú, si lo tenemos en un jarrón, hay que ponerle agua hasta que sus raíces sean cubiertas, no más. Si le das más agua te expones a arruinar el tallo. El bambú también se puede cultivar en una maceta, si eso te deja más tranquilo.\nPara que brille más, se recomienda frotar los brotes con un poquito de leche un mucha agua. Esto puedes hacerlo con un trapo, no hace falta que compres ningún producto especial.


En busca del libro perfecto: Book Tag #4: Las enfermedades de los libros\nBook Tag #4: Las enfermedades de los libros.\nMuy bien, este tag sin duda me llamó la atención, me ha encantado. Ojala fuera cierto para que yo fuera enfermera de libros, eso sería muy peculiar. Debo decir que este book tag lo vi en El Baúl de Sherezade, donde explicaban que hay que asociar\nCreo que La Redención de Gabriel, si hablamos de dulzura, este llegó a ser empalagoso y ridículo. Demasiada dulzura para mí gusto.\nLibro que leíste una vez y que no volverías a leer.\nToda la saga Hush Hush porque la odio, la miro en mi estantería y le tiró rashooos laser con mis ojos.\n3. El Ciclo\nUn libro que relees cada año o mes.\nNinguno, no soy de releer libros.\nCiudades de Papel de John Green, todos están leyendo este libro, el mio esta esperando en la estantería, pero aun no lo comienzo. Pero sin duda se esta esparciendo como un virus.\nCazadores de sombras: Ciudad de Cristal, ese libro a pesar de no ser uno de mis favoritos de la saga, logró tal suspenso y acción que no pude detenerme hasta terminarlo.\nUn libro que has leído, pero no te acuerdas.\nEl diario de Anna Frank, sé que lo leí en un momento cuando era pequeña, pero no me puedo acordar de los detalles. Creo que debería volver a leerlo.\nDivergente, creo que hace mucho que un libro no me provocaba tales sensaciones. Me encantó.\nOscuros, creo que a pesar de ser unas de mis sagas románticas favoritas, el primer libro no es muy bueno y todo por el tiempo que usó la escritora, además de no darle cierta chispa que se ve luego en los personajes. Esto ha provocado serios perjuicios para la saga ya que los lectores no pueden pasar del primer libro.\nUn libro que te llevo en un viaje a través del tiempo.\nEl atlas de las nubes de David Mitchell, uno de mis libros favoritos. Contar seis historias de vidas para unirla de una forma maravillosa, nos hace viajar desde tiempo coloniales hasta un futuro apocalíptico.\nPublicado por En busca del Libro Perfecto en 10:57\nKathy Rojas 15 de agosto de 2014, 12:17\n"le tiró rashooos laser con mis ojos." waajajajjajajaaaajaj que me hiciste reír xDD (me acorde de monster inc xD)\nyo creo q el verdadero virus aquí en John Green, después de Bajo la misma estrella sus libros se están vendiendo como pan caliente xD\nsiempre me he preguntado ¿los libros de cazadores de sombra son buenos? y ¿cuantos son? creo que esa saga o serie siempre me ha confundido y nunca he sentido interés por leerlo, igual que la saga oscuros ... quizás algún día los lea xD\ny El atlas de las nubes creo de definitivamente lo quiero leer :D


Centros de salud viñamarinos realizan intenso trabajo de prevención y tratamiento de la tuberculosis | Blog Oficial de Prensa\n← Municipio de Viña del Mar coordina apoyo a Censo 2017\nInvitación a presentación de concierto de los Niños Cantores de Viena realizó alcaldesa Virginia Reginato y Armada →\nPor su parte, la subdirectora del CESFAM, Brígida Zavala, Verónica Mora, destacó que “en nuestro centro de salud todos los días tomamos exámenes de diagnóstico. En 2016 realizamos 287 baciloscopías, de las cuales 4 resultaron ser casos de TBC y hoy se encuentran en tratamiento exitoso; y este año llevamos 2 casos diagnosticados que también están recibiendo tratamiento gratuito”.\nPublicado el 27 marzo, 2017 en Adultos Mayores, Apoyo a la comunidad, Bienestar, Ciudad, Informaciones generales, Municipio, Prevención, Salud. Añade a favoritos el enlace permanente.\tDeja un comentario.\nRT @cotyreginato: Con profundo pesar informo a la comunidad del fallecimiento de Don Vicente Gaponov, un gran hombre que aportó su visión,… 44 minutes ago