coge la información y corre

5 máximas

29 de Septiembre del 2009 Escrito por Alex Barros

Hoy se me han pasado por la cabeza estas máximas que creo que mueven mi vida.

  1. Ser Feliz
  2. Echarle Morro
  3. Reclamar lo que es justo
  4. Currárselo mucho
  5. Hacer que todo merezca la pena

No necesariamente en ese orden, sinó todas a la vez.

Ah, y por teneros un poco up-to-date: Actualmente retomando Informática (esta vez de Gestión), rodando y mejorando la WebSerie Tu Muerte Está Cerca, Trabajos diversos como himformático, y trabajos diversos como colaborador en rodajes.

Categorias: MySQL | 5 comentarios »

Curiosidad en la sintaxis del SELECT

27 de Octubre del 2008 Escrito por Alex Barros

Hace poco descubrí una curiosidad de SQL símplemente revisando la documentación del SELECT. Por eso creo que es interesante repasar la sintaxis oficial, para que no se nos escape nada.

  1. SELECT
  2.     [ALL | DISTINCT | DISTINCTROW ]
  3.       [HIGH_PRIORITY]
  4.       [STRAIGHT_JOIN]
  5.       [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
  6.       [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
  7.     select_expr, …
  8.     [FROM table_references
  9.     [WHERE where_condition]
  10.     [GROUP BY {col_name | expr | position}
  11.       [ASC | DESC], … [WITH ROLLUP]]
  12.     [HAVING where_condition]
  13.     [ORDER BY {col_name | expr | position}
  14.       [ASC | DESC], …]
  15.     [LIMIT {[offset,] row_count | row_count OFFSET offset}]
  16.     [PROCEDURE procedure_name(argument_list)]
  17.     [INTO OUTFILE ‘file_name’ export_options
  18.       | INTO DUMPFILE ‘file_name’
  19.       | INTO var_name [, var_name]]
  20.     [FOR UPDATE | LOCK IN SHARE MODE]]

La curiosidad

Lo que yo desconocía es que es posible ordenar los resultados por dos campos o más. Es decir, hacer la ordenación en función de varios parámetros.

Un ejemplo:

  1. SELECT a,b,c FROM mi_tabla WHERE a > 100 ORDER BY b,c

En este Select, los resultados son ordenados según b y c de la mejor forma posible. Puede que ni b ni c queden ordenados estrictamente, sinó que adoptan las mejores posiciones para estar ordenados por ambos a la vez.

Yendo más lejos aún, podemos especificar campo a campo si queremos que se ordene ascendentemente o descendientemente, combinando varios criterios.

  1. SELECT a,b,c FROM mi_tabla WHERE a > 100 ORDER BY b ASC,c DESC

Categorias: MySQL | 2 comentarios »

MySQL – Seleccionar al azar, o lista desordenada

11 de Agosto del 2008 Escrito por Alex Barros

Tan sencillo como usar la función RAND() de MySQL.

La clave está en ordenar los elementos seleccionados por un parámetro aleatorio. Un ejemplo sería esta sentencia:

  1. SELECT * FROM mi_tabla WHERE a > 10 AND b < 200 ORDER BY RAND()

Esto nos daría los resultados que queremos, ordenados aleatoriamente.

Si queremos coger un sólo registro al azar, no tenemos más que limitar el anterior Select a un registro.

  1. SELECT * FROM mi_tabla WHERE a > 10 AND b < 200 ORDER BY RAND() LIMIT 1

Como diría Janet Jackson, I want FeedBack!!

Categorias: Código, MySQL | 3 comentarios »

Explicación visual de los SQL Join – Unir tablas con SQL

12 de Octubre del 2007 Escrito por Alex Barros

Me ha parecido muy interesante el artículo escrito por Jeff Atwood titulado A Visual Explanation of SQL Joins.

Tanto es así que he decidido traducir este artículo al español. Disfrutad:

Autor Original: Jeff Atwood
Fecha: 11/10/07
Traductor: Alex Barros

Pensé que el post de Ligaya Turmelle sobre SQL joins era una genial introducción para los desarrolladores primerizos. Dado que los SQL joins están basados fundamentalmente en conjuntos relacionados, el uso de diagramas de Venn para explicarlo parece lo más acertado. De todas formas, igual que los comentaristas de su post, opino que sus diagramas de Venn no encajaban con la sintaxis de SQL join en mis pruebas.

Aún así me encanta el concepto, así que veamos si podemos hacerlo funcionar. Supongamos que tenemos las dos siguientes tablas. La tabla A está a la izquierda, y la tabla B está a la derecha. Las rellenaremos con cuatro registros cada una.

tabla A y B muestra

Ahora unamos estas dos tablas por el campo nombre de algunas formas distintas, y veamos si podemos obtener unas representaciones conceptuales con los ingeniosos diagramas de Venn.

Inner join sólo produce los registros que coinciden en las dos tablas A y B.

  1. SELECT * FROM TablaA
  2. INNER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Resultado de Inner Join Join Inner

Full outer join produce el conjunto de todos los registros en las tablas A y B, con registros coincidentes en ambos lados cuando sea posible. Si no hay coincidencia, el lado que falta contendrá null.

  1. SELECT * FROM TablaA
  2. FULL OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Resultado de Full Outer Join Join Cartesian

Left outer join produce el conjunto completo de registros de la tabla A, con los registros coincidentes (si están disponibles) en la tabla B. Si no hay coincidencia, el lado derecho contendrá null.

  1. SELECT * FROM TablaA
  2. LEFT OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre

Resultado de Left Outer Join Join Left

Para producir el conjunto de registros en la tabla A, pero no en la tabla B, usamos el mismo Left Outer Join, y luego excluimos los registros que no queremos del lado derecho mediante una cláusula Where.

  1. SELECT * FROM TablaA
  2. LEFT OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre
  4. WHERE TablaB.id IS NULL

Resultado de Left Outer Join con exclusión Join Left Outer

Para producir el conjunto de registros únicos de la tabla A y la tabla B, usamos el mismo Full Outer Join, y luego excluimos los registros que no queremos de los dos lados mediante una cláusula Where.

  1. SELECT * FROM TablaA
  2. FULL OUTER JOIN TablaB
  3. ON TablaA.nombre = TablaB.nombre
  4. WHERE TablaA.id IS NULL
  5. OR TablaB.id IS NULL

Resultado de Full Outer Join con exclusión Join Outer

También hay un cross join, el cuál no puede ser expresado con un diagrama de Venn:

  1. SELECT * FROM TablaA
  2. CROSS JOIN TablaB

Esto une “todo con todo”, dando como resultado 4 x 4 = 16 filas, muchas más de las que teníamos en los conjuntos originales. Si haces unos simples cálculos, puedes ver por qué es un Join muy peligroso de ejecutar en tablas grandes.

Ver también: Hacer Múltiples Join en una sola Sentencia

Categorias: MySQL, Web | 110 comentarios »

INNER JOIN para unir Tablas

15 de Marzo del 2006 Escrito por Alex Barros

Muy bien, aprendices del Sql, hoy hablaremos de la instrucción INNER JOIN. Muy útil para casos concretos.

Primero de todo vamos a crear una situación hipotética:

Imaginemos que tenemos que hacer una web que contiene unos artículos en referencia a comentarios de novelas, y que son doce escritores de prestigio los que van introduciendo esas críticas.

Lo normal y más básico para un programador sería pensar en base de datos y lenguaje dinámico. Una buena elección podría ser trabajar con PHP y MySql (aunque para lo que voy a decir basta con una base de datos de tipo Sql).

Lo primero que nos viene a la mente es: haré una tabla, llamémosla criticas. En ella almacenaríamos cada artículo. Los campos básicos serían ID, Libro, Escritor (del libro, nunca confundir con el autor de la crítica), Editorial, año … y Autor de la crítica.

Pero y si quisiéramos, como es normal, poner en la misma crítica una referencia al autor de la critica, aúnque sólo sea un pequeño texto biográfico? Tendríamos que repetir un mismo texto repetidas veces en la base (la biografia de doce autores en, pongamos 150 registros) y si quisieramos modificarlo y hubiera 70 entradas con ese autor… eso sería un desastre.

http://modulos.zumbe.net/imagenes/inner_join_criticas.gif

Entonces queda claro que hay que hacer una referencia a otra tabla que contenga a los autores, con sus respectivos datos. La tabla autores. Cada autor tendría su ID, su nombre y su biografía, además de otros datos como webpage, e-mail, bibliografía…

Algunos dirían: pues fácil, haces dos querys a la base. en uno le dices

  1. SELECT * FROM criticas WHERE ID =‘37′

y en otra

  1. SELECT * FROM autores WHERE

where qué? tendrías que sacar una variable de sql a php, otra vez a sql…
Nada! Si alguien sugiere eso desconfiad de él y de su familia (es broma ;D) existe un método sencillo y eficaz: el INNER JOIN

Tan sencilla es la sentencia como:

  1. SELECT * FROM criticas INNER JOIN autores ON criticas.autor = autores.id WHERE criticas.id=‘7′

De esta forma estamos uniendo las dos tablas, cada vez que en criticas el autor sea n, en autores se unirá su correspondiente fila, con id=n.

Traduciendo al español la sentencia dice exactamente:

SELECCIONA TODOS LOS CAMPOS UNIENDO criticas CON autores DONDE el campo autor de la tabla criticas SEA IGUAL A el campo id de la tabla autores EN EL REGISTRO EN QUE el id de criticas sea 7

En definitiva, el inner join une dos tablas, donde encajan un campo de una con el mismo de la otra.

A partir de ahora las tablas se hacen más manejables y flexibles.

Y recordad!:

  • Para seleccionar campos de cada tabla : tabla.campo universal en sql, dato importante.
  • Estructura del inner join: SELECT campos FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
  • Antes de hacer barbaridades con vuestras bases de datos documentaos un poco, lo digo por experiencia ;)

Ver también: Explicación visual de los SQL Join
Ver también: Hacer Múltiples Join en una sola Sentencia

Categorias: Código, HOWTO/CóMO, MySQL | 16 comentarios »

del.icio.us meneame.net RSS

Buscar:

Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas Recientes

Meta:

Respeta el copyleft

,