André L. S. Desenvolvimento de Softwares, Tecnologia e Games

30jul/100

INNER JOIN e OUTER JOIN

Se você é um DBA ou trabalha com programação e usa muito banco de dados SQL, este tópico não é você, a menos que não conheça as cláusulas INNER JOIN e OUTER JOIN, muito comuns em SGBDs SQL.

Não sabe o que é SGBD? Os Sistemas de Gerenciamento de Banco de Dados são programas que auxiliam na manipulação dos dados armazenados. O MySQL, PostgreSQL, MS SQL Server ou Oracle, que você tem em sua casa ou empresa, são SGBDs.

Para este tutorial você precisa ter, pelo menos, o conhecimento básico de SQL.

Chega de enrolação, vamos ao que interessa!

INNER JOIN

A cláusula INNER JOIN é usada quando se quer recuperar dados em mais de uma tabela através da igualdade de suas foreign keys.

Por exemplo, pense que você quer criar um programa que sirva como agenda telefônica. Você cadastra as pessoas e os contatos telefônicos, como uma pessoa poderá ter nenhum até N números de telefones, você separa em duas entidades como neste modelo:

Olhando rapidamente você percebe que a entidade TELEFONE tem o atributo NUM_PESSOA que é o número de identificação do registro na entidade PESSOA.

Vamos supor que as tabelas estejam preenchidas com os seguintes registros:

 +----------------------------+  +---------------------------+
 |           PESSOA           |  |         CONTATO           |
 +------------+---------------+  +------------+--------------+
 | NUM_PESSOA | NOME_PESSOA   |  | NUM_PESSOA | NUM_TELEFONE |
 | 1          | José          |  | 1          | 6589-3666    |
 | 2          | Arnaldo       |  | 3          | 9888-6699    |
 | 3          | Maria         |  | 3          | 8956-6666    |
 | 4          | Elverdelando  |  | 2          | 2888-9877    |
 +------------+---------------+  +------------+--------------+

Para recuperar os telefones de uma pessoa você deve usar INNER JOIN, implicitamente ou explicitamente. Vou explicar os dois casos.

O método explícito é usar a cláusula explicitamente (duh!), que é formada por INNER JOIN <tabela filha> ON <atributos de identificação>;, no nosso exemplo:
SELECT nome_completo, num_telefone FROM pessoa INNER JOIN telefone ON pessoa.num_pessoa = telefone.num_pessoa.

Estamos dizendo: "me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA".

Na forma implícita você não usa a cláusula INNER JOIN, o tratamento de igualdade é feito na cláusula WHERE. Usando o mesmo exemplo:
SELECT nome_completo, num_telefone FROM pessoa, telefone WHERE pessoa.num_pessoa = telefone.num_pessoa.

Em ambos os casos o resultado será:

 +---------------------------+
 |         CONTATO           |
 +------------+--------------+
 | NOM_PESSOA | NUM_TELEFONE |
 | José       | 6589-3666    |
 | Maria      | 9888-6699    |
 | Maria      | 8956-6666    |
 | Arnaldo    | 2888-9877    |
 +------------+--------------+

"Que simples! Hummmm espera um pouco... Onde está o Elverdelando (que nominho, hein?!)."

Lembra que dissemos ao banco "me traga o nome e os números dos telefones da pessoa onde o número da pessoa em TELEFONE seja igual ao número da pessoa em PESSOA"? Então! O Elverdelando não esta na tabela TELEFONE, por isso não foi retornado no resultado.

Quando você precisar retornar os dados, mesmo não estando na tabela filha, usamos o OUTER JOIN.

OUTER JOIN

A clásula OUTER JOIN tem duas variantes, LEFT OUTER JOIN e RIGHT OUTER JOIN, sendo que estas cláusula devem ser declaradas sempre de maneira explícita. Alguns SGBDs facilitam a utilização do OUTER JOIN te polpando de declarar toda a sintaxe, como é o caso do Oracle que utiliza o símbolo (+) na identificação fraca, mas NÃO É ANSI, ou seja, não funcionará em qualquer SGBD.

Para que apareçam todas as pessoas, inclusive as que não têm número de telefone cadastrado usamos LEFT OUTER JOIN ou RIGHT OUTER JOIN.

A sintaxe é parecida com a INNER JOIN, mudando apenas o nome da cláusula: LEFT[RIGHT] OUTER JOIN <tabela filha> ON <atributos de identificação>;

Assim, faremos...
SELECT nome_completo, num_telefone FROM pessoa LEFT OUTER JOIN telefone ON pessoa.num_pessoa = telefone.num_pessoa
ou então
SELECT nome_completo, num_telefone FROM telefone RIGHT OUTER JOIN pessoa ON pessoa.num_pessoa = telefone.num_pessoa

Em ambos os casos o resultado será:

 +-----------------------------+
 |         CONTATO             |
 +--------------+--------------+
 | NOM_PESSOA   | NUM_TELEFONE |
 | José         | 6589-3666    |
 | Maria        | 9888-6699    |
 | Maria        | 8956-6666    |
 | Arnaldo      | 2888-9877    |
 | Elverdelando |              |
 +--------------+--------------+

Como você pôde perceber, a única diferença entre o LEFT OUTER JOIN e o RIGHT OUTER JOIN é só a indicação de qual é o lado forte do relacionamento, ou seja, em qual lado da cláusula está a tabela que pode não ter valores na tabela filha. No nosso caso, ambos apontando para a tabela PESSOA.

INNER JOIN é muito usado para consulta em banco de dados, quase que totalmente em seu método implícito. Já as cláusulas OUTER JOIN também são usadas, mas não com tanta frequência, posso dizer que é raro encontra-las por aí.

Espero que este tutorial os ajude! ;)

22jul/100

Novo sistema de busca de imagens da Google. Surpreendente!

A Google procura sempre inovar em seus serviços. Com o sistema de busca por imagens não foi diferente.

Para quem está no Brasil e acessa o serviço o domínio usando .com.br pode não usufruir da nova interface. As imagens não mais aparecem em formato tabular, agora elas ficam "desorganizada" para facilitar a identificação visual e aproveitar o máximo de espaço disponível no monitor do usuário.

Click para ampliar

Ao passar o mouse sobre a imagem ela se destaca, exibindo a origem e as dimensões. Também não há mais paginação. As imagens são exibidas e carregadas conforme o usuário vai descendo pela página.

A imagem, ao clicar, é exibida em sua página de origem, destacada por uma janela "modal" e com uma barra lateral contendo suas informações, sem o uso de frames para delírio dos Web Designers.

Clique para ampliar

Confira em http://www.google.com/imghp. Enjoy! ;)

9jun/100

Half-Life 2 e Half-Life 2: Episode 1 agora com achievements

Com o Steam sendo suportado em Macs, alguns jogos também foram migrados para a plataforma e, inclusive, com melhorias que também foram replicadas nas cópias para Windows.

Half-Life 2 e Half-Life 2: Episode 1 são jogos que sofreram melhorias. Os achievementes (objetivos dentro do jogo), que antes eram exclusivos para o Half-Life 2: Episode 2, também estão disponíveis no HL2 e HL2: Episode 1. São 46 achievements, 33 para o HL 2 e 13 para o HL 2: Episode 1.

Deu até vontade de "zerar" os jogos de novo! :)

6mai/102

Instalando suporte multi-idioma nos Windows 7 Professional e Home Premium

O suporte multi-idioma é nativo nas edições Enterprise e Ultimate do Windows 7, porém, seguindo este tutorial, você também conseguirá alternar entre os idiomas nas edições Professional e Home Premium.

Primeiro você precisará do Vistalizator. Este aplicativo lhe permite instalar o suporte multi-idiomas em todas as versões do Windows 7 e, como ele é portável, não precisa de instalação. Você pode baixa-lo clicando aqui.

Depois baixe os idiomas para a arquitetura x64 (64 bits) ou x86 (32 bits).

Agora execute o Vistalizator e clique em "Add languages".

Localize o arquivo com o idioma que deseja e clique em "Open".

Aparecerá a mensagem abaixo, então clique em OK para prosseguir.

Em seguida será aberta uma tela com os dados do arquivo e a descrição do idioma, então clique em "Install Language".

Aguarde e processo de extração e instalação.

O Vistalizator exibirá os idiomas instalados na sua máquina e, entre eles, estará o idioma que você escolheu. Selecione-o e clique em "Change language".

Reinicie o sistema e voilá. ;)

Agora você tem um Windows 7 com suporte multi-idioma.

A única coisa ruim que pude perceber até agora é que toda vez que quiser alternar entre os idiomas você precisará usar o Vistalizator, devido as edições Professional e Home Premium não ter esta opção habilitada por padrão.

2mai/100

Solucionando problemas com remoção de HD externo no Windows 7

Algumas vezes tive problemas quando removia meu HD externo usando o Assistente de Remoção de Dispositivos do Windows 7, o mais comum deles era o famoso "Este dispositivo está sendo usado no momento. Feche os programas ou janelas...". Esta mensagem aparecia mesmo com todos os programas fechados.

Depois de checar as configurações do Windows, seus processos e serviços, constatei que o problema estava no serviço "Serviço de compartilhamento de Rede do Windows Media Player", que me obrigava para-lo antes de remover o dispositivo.

Ainda sim, esta solução não me parecia correta, então encontrei a mais adequada. Segue:

O serviço "Serviço de compartilhamento de Rede do Windows Media Player" é responsável por compartilhar seus arquivos de mídia (músicas e vídeos) em sua rede ou internet (como seu próprio nome já diz). Esta configuração é padrão da instalação do Windows 7, então para desabilitar o recurso...

Clique em "Iniciar", na caixa de pesquisa digite "Central de rede e Compartilhamento" e selecione o aplicativo, conforme é exibido na imagem acima

Clique na opção "Escolher opções de grupo doméstico e de compartilhamento"

Agora clique em "Escolha opções de streaming de mídia..."

Altere a opção do item "Programas de mídia neste PC e conexões remotas" para "Bloqueado"

Pronto, a partir de agora você poderá remover seu HD externo ou qualquer outro dispositivo de armazenamento removível sem problemas.

;)