Category: Aprendiz
enlaces
By admin on Feb 16, 2010 | In Aprendiz, Trucos avanzado | Send feedback »
Sólo quería entrar en un par de cosas que son de interés para aquellos que utilizan o programan de Mysql. En primer lugar, si uses Twitter la mejor manera de buscar artículos relacionados con MySQL es entrar #mysql en el campo de búsqueda.
En segundo lugar, este parece ser un enlace ideal para explorar más comandos en Mysql:
sentencias-en-mysql-que-tal-ves-no-conocias
Proyecto Euler 1 en Mysql
By admin on Sep 1, 2009 | In Aprendiz, Trucos avanzado | Send feedback »
Hola, he llegado recientemente a través del Proyecto de Euler http://projecteuler.net/ que plantea retos matemáticos en cualquier lenguaje de codificación que prefieres utilizar.
Entonces no estoy diciendo que MySQL es especialmente apto para afrontar estos retos, pero me preguntaba si yo podría resolver uno o dos solamente por el uso de MySQL.
He aquí la primera cuestión
Si hacemos una lista de los numeros naturales múltiplos de 3 ó 5, menores de 10.
Obtenemos 3,5,6 y 9. La suma de estos múltiplos es 23.
Hallar la suma de todos los multiplos de 3 o 5 menores de 1000.
En primer lugar voy a investigar la forma en que se puede hacer en Perl y luego ver cómo se puede aplicar esto en Mysql. (La siguiente es una adaptación de una solución Perl que he encontrado en Euler_problems_as_perl_oneliners )
#!/usr/bin/perl
# adds each multiple of 3 to $n
# then adds each mutiple of 5 to $n unless divisible by 3
# to avoid duplication!
$n=0;
for($i=3;$i<1000;$i+=3) {$n+=$i}
for($i=5;$i<1000;$i+=5)
{$n+=$i unless $i%3 == 0}
print $n, "\n";
# produces 233168
Por mi código de MySQL voy a empezar por ver cómo probar si un número es divisible por otro número en sql. Una forma es utilizar la función de MOD que devuelve el resto exacto tras la división (Es operación de módulo). Por lo tanto, debe retornar 0, cuando el número es divisible por tu numero de prueba. Asi, select mod(9,3); retorna 0 mientras select mod(8,2); retorna 2.
A continuación, necesitamos una manera de reiterar hasta 999 (es decir, todos los números por debajo de 1000). Suelo usar una tabla llena con números ascendentes para este tipo de tarea; sin embargo, es posible utilizar una técnica de variables, siempre que se inscriba a una tabla de base de datos con el número necesario de filas en él. Por ejemplo, si tenemos una tabla llamada orders con 20.000 registros, se puede traer de vuelta a tan sólo 20 filas numeradas como este:
Code:
select @rownum:=@rownum+1 'row_num', e.* from orders e, | |
(SELECT @rownum:=0) r | |
order by orderid desc limit 20 |
Así, con el fin de traer de vuelta a todos aquellos en los que el row_num campo es divisible por 3, ponemos el código anterior en un SELECT interno (Inner Select):
Code:
select row_num from | |
(select @rownum:=@rownum+1 'row_num' | |
from orders e, | |
(SELECT @rownum:=0) r | |
order by orderid desc limit 20) tmp | |
where mod(row_num,3) = 0; |
Por último añadir una cláusula de OR incluir números divisibles por 5, y suma el resultado:
Code:
select sum(row_num) from | |
(select @rownum:=@rownum+1 'row_num' | |
from orders e, | |
(SELECT @rownum:=0) r | |
order by orderid desc limit 999) tmp | |
where mod(row_num,3) = 0 or mod(row_num,5) = 0; |
Esto da una respuesta de: 233168. Se volvió bastante rápidamente también - apenas 0,08 de segundo! Hasta pronto!
Trucos y consejos útiles
By admin on Jul 2, 2009 | In Aprendiz | Send feedback »
Mi intención es incluir en este hilo, los pequeños trucos y consejos que me he encontrado con el tiempo, que realmente ayuda al utilizar Mysql. Yo probablemente añadir a este hilo como encontrar más.
Por ejemplo, si estás utilizando commandline-Mysql (es decir - la herramienta intérprete de comandos mysql), puedes mostrar la estructura de una tabla de base de datos muy fácilmente (Muestra la sentencia CREATE TABLE que se utilizó para crear la tabla):
Code:
show create table table_name; |
Una sugerencia útil cuando se ejecuta consultas SQL (una vez más cuando se utiliza commandline-Mysql) es poner fin a una consulta con \G en lugar de usar un punto y coma. Esto muestra los registros en formato de registro en lugar de columnas.
Normalmente, las consultas de Mysql no tienen sensibilidad entre mayúsculas y minúsculas - si buscas un campo que contenga '%Rey%", la consulta traerá de vuelta los resultados en los que el campo contiene "rey","Rey"o incluso"REY". Para hacer que tus consultas sean sensibles a las mayúsculas, te recomiendo que utilizas el operador BINARY en las expresiones. Por ejemplo:
Code:
Select campo from T1Nombre where binary campo like '%Rey%'; |
Si estás realizando operaciones en una campo tipo datetime, utiliza la función de "date", por ejemplo:
Code:
select fechadeorden from tablaentries where date(fechadeorden) = '2008-04-14' \G |
Hay más!
Si deseas cambiar el orden de una sortear (por ejemplo, ordenar por 1, 4, 3, 2 en vez de 1, 2, 3,4)
puede utilizar la función field en el cláusula Order By.
Por ejemplo
Code:
Order By Field(campo_sortear,1,4,3,2) |
Puedes leer más sobre Field e otros funciones para cadenas de caracteres aqui !!!. Por supuesto, siempre podrás utilizar el CASE declaración en el cláusula ORDER BY, pero siempre es bueno tener una opción!
A veces es bueno saber el rango de valores en su búsqueda/consulta de datos - lo que es el valor máximo, la longitud mínima almacenados, etc -especialmente cuando se trabaja qué tipo de índice para aplicar. En este escenario, el Procedimiento Analyse es muy útil. Esto examina el resultado de tu consulta y retorna un análisis del resultado. Por ejemplo:
Code:
select * from orders procedure analyse(0,0)\G |
Aunque es en Inglés, aquí es un artículo muy útil
sobre crear un índice en columnas de texto en Mysql.