Aplicando Instruções Condicionais em ON / WHERE
Aqui eu expliquei sobre as etapas do processamento de consultas lógicas.
Referência: Por dentro do Microsoft® SQL Server ™ 2005 T-SQL Querying
Editor: Microsoft Press
Pub Data: 07 de março de 2006
Imprimir ISBN-10: 0-7356-2313-9
Imprimir ISBN-13: 978-0-7356-2313-2
Páginas: 640
Por dentro do Microsoft® SQL Server ™ 2005 Consulta T-SQL
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
O primeiro aspecto perceptível do SQL que é diferente de outras linguagens de programação é a ordem na qual o código é processado. Na maioria das linguagens de programação, o código é processado na ordem em que está escrito. No SQL, a primeira cláusula processada é a cláusula FROM, enquanto a cláusula SELECT, que aparece primeiro, é processada quase por último.
Cada etapa gera uma tabela virtual usada como entrada para a etapa a seguir. Essas tabelas virtuais não estão disponíveis para o chamador (aplicativo cliente ou consulta externa). Somente a tabela gerada pela etapa final é retornada ao chamador. Se uma determinada cláusula não for especificada em uma consulta, a etapa correspondente será simplesmente ignorada.
Breve descrição das fases de processamento de consultas lógicas
Não se preocupe muito se a descrição das etapas não parece fazer muito sentido por enquanto. Estes são fornecidos como referência. As seções que vêm após o exemplo do cenário abordarão as etapas com muito mais detalhes.
FROM: um produto cartesiano (junção cruzada) é executado entre as duas primeiras tabelas na cláusula FROM e, como resultado, a tabela virtual VT1 é gerada.
LIGADO: O filtro LIGADO é aplicado ao VT1. Somente linhas para as quais <join_condition>
é TRUE são inseridas no VT2.
OUTER (junção): se um OUTER JOIN for especificado (em oposição a CROSS JOIN ou INNER JOIN), as linhas da tabela preservada ou as tabelas para as quais não foi encontrada uma correspondência serão adicionadas às linhas do VT2 como linhas externas, gerando VT3. Se mais de duas tabelas aparecerem na cláusula FROM, as etapas 1 a 3 serão aplicadas repetidamente entre o resultado da última associação e a próxima tabela na cláusula FROM até que todas as tabelas sejam processadas.
ONDE: O filtro ONDE é aplicado ao VT3. Somente linhas para as quais <where_condition>
é TRUE são inseridas no VT4.
GROUP BY: As linhas do VT4 são organizadas em grupos com base na lista de colunas especificada na cláusula GROUP BY. VT5 é gerado.
CUBO ROLLUP: Supergrupos (grupos de grupos) são adicionados às linhas do VT5, gerando VT6.
HAVING: O filtro HAVING é aplicado ao VT6. Somente grupos para os quais <having_condition>
é TRUE são inseridos no VT7.
SELECT: A lista SELECT é processada, gerando VT8.
DISTINCT: Linhas duplicadas são removidas do VT8. VT9 é gerado.
ORDER BY: As linhas do VT9 são classificadas de acordo com a lista de colunas especificada na cláusula ORDER BY. Um cursor é gerado (VC10).
TOPO: O número ou porcentagem de linhas especificado é selecionado desde o início do VC10. A tabela VT11 é gerada e retornada ao chamador.
Portanto, (INNER JOIN) ON filtrará os dados (a contagem de dados da VT será reduzida aqui) antes de aplicar a cláusula WHERE. As condições de junção subsequentes serão executadas com dados filtrados, o que melhora o desempenho. Depois disso, apenas a condição WHERE aplicará as condições de filtro.
(A aplicação de instruções condicionais em ON / WHERE não fará muita diferença em alguns casos. Isso depende de quantas tabelas você ingressou e do número de linhas disponíveis em cada tabela de ingresso)