SQL Dicas & Truques (parte 2)

Introdução

Independente da linguagem de programação que você escolhe para desenvolver seus projetos, uma sintaxe se torna onipresente em qualquer sistema que usa acesso à banco de dados, trata-se da linguagem SQL (Structured Query Language), que é usada para se comunicar com o banco de dados.

A SQL é uma linguagem padrão de acesso à banco de dados, porém dependendo do SGBD (Sistema de Gerenciamento de Banco de Dados) escolhido, podem existir pequenas variações entre seus comandos. Por exemplo, o MySQL é rico em funções de formatação de data, coisa que não é verdadeira quando se fala em PostgreSQL. Alguns SGBDs possuem recursos que outros não tem, como suporte a transações, sub-queries, etc.

Para quem ainda não está acostumado com o jargão técnico adotado pelos administradores de banco de dados, um SGBD é o sistema responsável por gerenciar a forma como os dados/registros são armazenados de forma física no disco rígido de seu computador e a forma como esses dados são recuperados. O Linux é muito rico em diversidade de SGBDs, vou citar somente os que considero os três principais na categoria, perdoem-me por omitir os demais:

O objetivo deste artigo é apresentar alguns truques de SQL baseados no MySQL, que é sem dúvidas o SGBD de maior sucesso quando se trata da combinação de Linux e Internet.

Este artigo é indicado para quem já possui alguma experiência com SQL

Otimizando suas consultas SQL

Um dos recursos mais poderosos na otimização de consultas SQL é a criação de índices em suas tabelas. No MySQL, por padrão a consulta às tabelas é feita de modo seqüencial e isso pode prejudicar e muito o desempenho de seu banco de dados quando o mesmo começa a tomar proporções grotescas e volume muito alto de acessos. Para entendermos a diferença entre uma consulta seqüencial e indexada, vamos a um exemplo prático.

Suponha que temos uma tabela chamada alfabeto e que desejamos encontrar a letra “P”. Podemos então construir a seguinte consulta SQL:

  mysql> SELECT letra FROM alfabeto WHERE letra='P';

Para encontrar a letra “P” de forma seqüencial, o MySQL percorrerá a seguinte lógica:.

  Posicione o cursor no primeiro registro da tabela:
  1> A  (A é igual a P? Não, próximo)
  2> B  (B é igual a P? Não, próximo)
  3> C  (C é igual a P? Não, próximo)
  ...
  16> P  (P é igual a P? Sim, retorne o resultado;

Levamos um total de 16 acessos aos registros da tabela para encontrarmos o valor desejado.

Agora vamos criar um índice para essa tabela sabendo que a coluna letra, do tipo CHAR(1), é a que nos servirá para encontrar dados:

mysql> CREATE INDEX ind_letra ON alfabeto (letra(1));

No comando acima criamos um índice chamado ind_letra na tabela alfabeto. Este índice está baseado na coluna letra e tem o tamanho de 1 caractere. Agora que temos o índice, vamos usá-lo em nossa consulta ao banco de dados.

mysql> SELECT letra FROM alfabeto USE INDEX (ind_letra) WHERE letra='P';

Note que apenas adicionamos a sintaxe USE INDEX (nome_do_índice) à consulta. Dessa forma, eis o caminho lógico que o MySQL percorrerá para encontrar a letra desejada:

  Posicione o cursor no primeiro índice da tabela (que é a letra do meio   do alfabeto):

  1> M (M é igual a P? Não, é menor. Então vamos ao próximo índice)
  Agora sobraram as letras maiores que M. Qual é o ponto médio entre M e Z?
  2> S (S é igual a P? Não, é maior. Então vamos ao próximo índice)
  Agora sobraram as letras menores que S e maiores que M. Qual é o ponto médio entre M e S?
  3> P (P é igual a P? Sim, retorne o resultado)

Pasmem, usando a lógica de índices o MySQL levou 3 acessos para encontrar a letra P. Gostaram da idéia? Que tal implementar índices em suas tabelas?

Para saber mais sobre índices, leia o capítulo do Manual do MySQL que fala sobre isso:

Formatando resultados

Quanto maior o domínio que você adquire da sintaxe SQL, menor serão os seus problemas na criação de seu programa, seja ele na linguagem que for. Por exemplo, vamos supor tenho uma tabela chamada dicas com uma coluna texto que possui 250 caracteres, mas desejo que seja retornado apenas os primeiros 50 dígitos. Para isso temos a função SUBSTRING(str, pos, len):

  mysql> SELECT SUBSTRING(texto, 1, 50) FROM dicas;

Acho que com isso você não precisa mais descobrir qual é a função para extração de substrings em sua linguagem de programação né? E além disso, seu código-fonte fica mais curto e legível.

Outras funções interessantes são a de transformar todo o texto em letras maiúsculas ou minúsculas. São elas: UPPER(str) e LOWER(str) respectivamente:

  mysql> SELECT UPPER(texto) FROM dicas;
  mysql> SELECT LOWER(texto) FROM dicas;

Conclusão

A linguagem SQL é muito rica em recursos e seu amplo domínio resulta em melhoria de performance nas consultas ao banco de dados, além de uma melhoria considerável na qualidade do código-fonte de seus projetos.

A leitura de um bom manual SQL é fundamental para quem tem pretensões de se dar bem nesta área e o que recomendo é o próprio manual do MySQL, que na maioria do tempo mostra uma sintaxe SQL que irá funcionar em todos os outros SGBDs:

http://www.mysql.com/doc/en/index.html

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s