Muitos programadores não sabem, mas bancos de dados são muito mais que tabelas sem vida. Existe muita inteligência por trás delas esperando para serem usadas. Confira aqui um pouco sobre isso.
Bancos de dados deixaram há muito de ser simplesmente um repositório de informações usados para, no máximo, organizar registros de tal forma que posteriormente pudessem ser indexados e/ou recuperados de alguma forma. Hoje eles são ferramentas poderosas nas tomadas de decisões dentro das empresas que, aproveitando-se da grande quantidade de dados lá existentes, extraem análises de vários tipos para executarem os próximos movimentos e ações em seus mercados.
Mas o banco de dados por sí não opera milagres. É necessária a presença de um profissional conhecedor de suas ferramentas e entranhas para tirar dele tudo aquilo que é possível. Este profissional normalmente conhecido por DBA (Database Administrator) é a peça fundamental neste processo.
Por outro lado, os desenvolvedores de software mesmo não sendo especialistas em bancos de dados como os DBA’s, podem (e devem) aproveitar um pouco do que é oferecido por estas ferramentas para criar aplicações mais rápidas, mais enxutas e mais “limpas”, aproveitando funções existentes mas que na maioria das vezes são esquecidas no momento do desenvolvimento. Sobre isso que vamos falar hoje: aproveitamento de funções de bancos de dados.
Obs: neste artigo usarei exemplos com o banco de dados MySQL e a linguagem PHP. Entretanto com toda a certeza eles podem ser usados também com outras bases e linguagens de forma semelheante.
Somando valores, e concatenando campos
Com uma frequência impressionante, precisamos somar valores vindos de uma base de dados. Para fazer isso dentro do código do programa, podemos ter:
$Rst = mysql_query(“SELECT valor FROM tabela”,$conexao);
while($valor=mysql_fetch_row($Rst)){
$resultado = $resultado + $valor[0];
}
print $resultado;
Mas, que tal assim:
$Rst = mysql_fetch_row(mysql_query(“SELECT SUM(valor) FROM tabela”, $conexao));
print $Rst[0];
Hmmm… de 5 linhas para duas? Mas como?
O “segredo” está na função SUM usada na segunda instrução. Ela simplesmente soma os valores do campo e reduz um laço dentro do código. Com isso temos mais eficiência, velocidade e código limpo.
Um outro exemplo interessante pode ser visto quando, por exemplo, precisamos concatenar (unir) dois campos. Para criar uma tabela no código, faríamos assim:
$Rst = mysql_query(“SELECT nome, sobrenome FROM tabela”,$conexao);
while($valor=mysql_fetch_row($Rst)){
echo ‘Nome Completo: ‘.$valor[0].$valor[1].”;
}
Mas também pode ser feito assim:
$Rst = mysql_query(“SELECT CONCAT(nome, sobrenome) FROM tabela”,$conexao);
while($valor=mysql_fetch_row($Rst)){
echo ‘Nome Completo: ‘.$valor[0].”;
}
Observe que não temos redução de linhas mas de caracteres que deixam o código mais limpo e aproveitamos o processamento do banco ao invés do servidor web. A concatenação é feita pela função CONCAT no segundo exemplo e depois somente precisamos imprimir uma variável, ao invés de duas, evitando assim problemas de interpretação.
Datas? Não se perca
Muitas vezes o trabalho com datas é um pesadelo para o programador. Soma de dias, meses, em que dia da semana caiu tal data e assim por diante.
Como para strings, bancos de dados também possuem um conjunto interessante de funções para a manipulação de datas. Vamos ver algumas.
A data atual
Já vi muito programador criar função para a inserção de datas dentro de registros em bases de dados. Acredito que isso seja por não conhecer uma pequena mas muito útil função chamada now(). Com ela, a data e/ou hora atual são armazenadas em campos que necessitam este valor.
mysql_query(“INSERT INTO tabela (data) VALUES (now())”,$conexao);
Esta função simplesmente pega a informação de data e hora do servidor e insere no campo que deseja (neste exemplo, em data). Mas cuidado; se o servidor está com a data/hora erradas, o valor que será inserido também estará errado. Assim é interessante manter o servidor com horário sempre sincronizado com time servers existentes na Internet.
Além disso, em alguns momentos precisamos saber em que semana estamos do ano ou ainda quantas semanas faltam para o fim do ano. Ao invés de complexos códigos de linguagem, podemos usar a base de dados para nos informar este resultado rapidamente. Por exemplo, em que semana do mês estamos agora?
print mysql_result(mysql_query(“SELECT WEEK(now())”,$conexao),0);
// resultado: 18
Aqui foi usada a função WEEK que retorna o número da semana de uma determinada data. Neste caso, a data informada é “hoje” pois usamos como parâmetro de data a função now() que, como já apresentado anteriormente, é a data atual do servidor.
Outra tarefa comum com datas é a soma de dias em uma data específica. Pode parecer simples mas como o formato de data é diferente de formatos numéricos e strings, muitas vezes o resultado está errado e não sabemos porquê.
A forma mais simples é novamente deixar o banco de dados trabalhar por você. Então para acrescentar, por exemplo, dez dias à data atual, fazemos:
print mysql_result(mysql_query(“SELECT DATE_ADD(now(),INTERVAL 10 DAY)”,$conexao),0);
// resultado: 2006-05-16
Com isso temos, em uma única linha, o valor que precisamos com a certeza que se trata de uma data válida, inclusive contando meses que possuem somente 28, 29 ou 30 dias (experimente fazer a soma de 10 dias à data de 25/02/2006 e verá o resultado).
Conclusão
Pequenas e simples funções quando bem utilizadas facilitam a vida de qualquer desenvolvedor. Assim, antes de “quebrar a cabeça” com dezenas de linhas de código para resolver um problema ou demanda, procure saber se as ferramentas que está utilizando não dispõem de formas mais simples para a solução deste problema. Muitas vezes a solução mais simples está diante dos olhos e perdemos tempo tentando algo diferente.
Estes exemplos são pequenos e simples se comparados a enorme gama de opções existentes nas bases de dados. Funções para data, strings, funções matemáticas e outras tantas estão disponíveis na maioria das bases de dados relacionais existentes hoje em dia. Para o MySQL, acesse http://dev.mysql.com/doc/refman/4.1/pt/functions.html. Já para o PostgreSQL, acesse http://www.postgresql.org/docs/8.1/static/functions.html
Espero que tenha gostado e aprendido um pouco mais.
Abraços!