Qualquer consulta envolvendo mais de uma tabela requer alguma forma de associação para vincular os resultados da tabela "A" à tabela "B". O meio tradicional (ANSI-89) de fazer isso é:
- Liste as tabelas envolvidas em uma lista separada por vírgulas na cláusula FROM
-
Escreva a associação entre as tabelas na cláusula WHERE
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
Aqui está a consulta reescrita usando a sintaxe ANSI-92 JOIN:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
De uma perspectiva de desempenho:
Onde houver suporte (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), não há benefício de desempenho ao usar uma sintaxe sobre a outra. O otimizador os vê como a mesma consulta. Mas consultas mais complexas podem se beneficiar do uso da sintaxe ANSI-92:
- Capacidade de controlar a ordem JOIN - a ordem em que as tabelas são verificadas
- Capacidade de aplicar critérios de filtro em uma tabela antes de ingressar
De uma perspectiva de manutenção:
Existem inúmeras razões para usar a sintaxe ANSI-92 JOIN sobre ANSI-89:
- Mais legível, pois os critérios JOIN são separados da cláusula WHERE
- Menos probabilidade de perder os critérios JOIN
- Suporte de sintaxe consistente para tipos JOIN diferentes de INNER, facilitando o uso de consultas em outros bancos de dados
- A cláusula WHERE serve apenas como filtragem do produto cartesiano das tabelas unidas
De uma perspectiva de design:
A sintaxe ANSI-92 JOIN é padrão, não antipadrão:
- O objetivo da consulta é mais óbvio; as colunas usadas pelo aplicativo são claras
- Ele segue a regra de modularidade sobre o uso de tipagem estrita sempre que possível. Explícito é quase universalmente melhor.
Conclusão
Sem familiaridade e/ou conforto, não vejo nenhum benefício em continuar usando a cláusula ANSI-89 WHERE em vez da sintaxe ANSI-92 JOIN. Alguns podem reclamar que a sintaxe ANSI-92 é mais detalhada, mas é isso que a torna explícita. Quanto mais explícito, mais fácil é entender e manter.