Telescope (core)
Padrão de codificação/indentação SQL
ADS.FAQ-25735
Sempre que possível, as consultas SQL (e comandos DML) deverão ser registradas da seguinte forma:
select COL1 as ALIAS1
, COL2 as ALIAS2
, COL3 as ALIAS3
...
from TABELA1 a
join TABELA2 on condicao
left join TABELA3 on condicao
...
where condicao1
and condicao2
and condicao3
...
group by ...
, ...
order by ...
, ...
limit X offset Y
As regras são:
- A primeira coluna é colocada logo após o comando SELECT
- Caso as colunas não couberem na mesma linha, as demais colunas são colocadas uma a cada linha que deverá começar com uma vírgula seguida de um espaço
- As palavras-chave FROM, JOIN, WHERE, ORDER BY, GROUP BY, UNION, HAVING devem ser incluídas em um anova linha
- A primeira condição da clausula deve ser colocada logo após o WHERE
- Sempre que a condição não coube na mesma linha (exceder a 100 caracteres), as demais condições do tipo AND deverão ser colocadas em linhas separadas, formando uma condição (AND) por linha.
- Expressões com OR devem ser isoladas entre parenteses.
Expressões
Sempre que houverem expressões extensas dentro do SQL, deve-se quebrar as linhas utilizando os critérios abaixo.
Blocos separados por "(" e ")" devem ter a primeira linha logo a direita do "(" e todas as demais linhas devem ficar alinhadas com o primeiro. Exemplo:
select ...
, ped.valor_total / (bdx.fator_conversao * ped.valor_mercadorias
+ bdy.taxas_administrativas) as abaco
, ...
Ao quebrar em operadores, o operador deve iniciar a próxima linha. Neste caso, o operador deve ser alinhado de forma que fique abaixo do início da expressão para a qual ele está associado. Exemplos:
select ...
, ped.valor_total
/ (bdx.fator_conversao * ped.valor_mercadorias
+ bdy.taxas_administrativas) as abaco
, ...
select ...
from pedidos pven
join itens_pedidos iven on iven.pedido_id = pven.id
join itens_pedidos icom on icom.item_pedido_venda_id = iven.id
join pedidos pcom on pcom.id = icom.pedido_id
and pcom.fornecedor_id = pven.fornecedor_id
...
Sub-queries
Quando o SQL possuir uma sub-quey, devem ser utilizados os critérios abaixo.
Caso a sub-query ser muito pequena, ele pode ser completamente inserida como uma expressão simples. Exemplo:
select ped.id
, (select sum(valor) from itens where pai_id = ped.id) as soma
from pedidos ped
...
Caso a sub-query seja maior, sugere-se separar toda ela em linhas separadas, seguindo os mesmo critérios de um SQL normal, mas indentando o bloco de forma que a segunda linha fique alinhada à primeira linha que é iniciada logo após o "(". A ultima linha é encerrada com o ")". Exemplo:
select ped.id
, (select sum(i.valor_unitario * i.quantidade)
from itens_pedidos i
where i.pai_id = ped.id) as soma
from pedidos ped
...
UNION
O uso do UNION implica que devem existir dois SELECTS com a mesma estrutura de colunas. Para facilitar a visibilidade disso, deve existir uma linha em branco antes e depois do comando UNION ou UNION ALL.
Exemplo:
select doc.emitente_uf as uf
, sum(valor_total_icms_estado_remetente) as valor
, 0.0 as fcp
from doc_entradas_saidas doc
inner join especies esp on esp.id = doc.especie_id
where estabelecimento_id = ?
and data_emissao between ? and ?
group by doc.emitente_uf
union all
select doc.destinatario_uf as uf
, sum(valor_total_icms_estado_destino) as valor
, sum(valor_total_icms_fcp) as fcp
from doc_entradas_saidas doc
inner join especies esp on esp.id = doc.especie_id
where estabelecimento_id = ?
and data_emissao between ? and ?
group by doc.destinatario_uf
Uso de SQL em códigos Java
No caso de códigos java que precisam de comandos SQL, a String contendo o SQL deve seguir a mesma regra acima e todas as linhas após a primeira DEVEM iniciar com um espaço. Exemplo:
String sql = "select gu.grupo"
+ " from permissoes_acesso_registros par"
+ " join grupos_usuarios gu on gu.id = par.grupo_id"
+ " where par.registro_id = ?"
+ " and par.tabela = ?"
+ " order by gu.grupo";
Os motivos para usar um espaço no INÍCIO de cada linha são:
- As palavras-chaves ficam mais destacadas com um espaço antes do que com o sinal de aspas duplas.
- É mais difícil de esquecer de informar um espaço o que causaria um erro de execução no SQL. No final da linha, a falta do espaço passa mais facilmente desapercebido.