Voltar para a lista de artigos Artigos
6 minutos de leitura

Ordem de Operações SQL

O SQL não é uma linguagem tradicional de programação na qual você escreve uma sequência de instruções em uma determinada ordem de execução. Pelo contrário, o SQL é uma linguagem "declarativa", o que significa que ao escrever uma consulta SQL, você declara quais dados espera como resultado da consulta, mas não indica como obtê-los.

Seis operações para ordenar: SELECT, FROM, WHERE, GROUP BY, HAVING e ORDER BY

Através de exemplos, vamos explicar a ordem de execução das seis operações mais comuns em uma consulta SQL. Como o banco de dados executa os componentes da consulta em uma ordem específica, é importante que o desenvolvedor saiba esta ordem. É semelhante a seguir uma receita: você precisa conhecer os ingredientes e o que fazer com eles, mas também precisa saber em qual ordem as tarefas devem ser realizadas. Se o banco de dados seguir uma ordem de operações diferente, o desempenho da consulta pode diminuir drasticamente.

A melhor maneira de aprender a ordem das operações SQL é praticando. Recomendo a Trilha de Práticas em SQL da LearnSQL.com.br. Ela contém mais de 600 exercícios práticos para exercitar suas habilidades SQL. Você também pode escolher o melhor curso para você dentre os mais de 30 cursos SQL interativos que oferecemos em vários níveis de proficiência.

Banco de dados de funcionários

Neste artigo, trabalharemos com um banco de dados para uma empresa comum que tem funcionários distribuídos em diferentes departamentos. Cada funcionário tem uma identificação, um nome e um salário, e pertence a um departamento, como podemos ver nas tabelas a seguir.

Parte da tabela FUNCIONARIO:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
100Tiago Silva 78000 CONTABILIDADE
101Maria Sesamo82000 TI
102Chun Yen 80500 CONTABILIDADE
103Agnes Miller95000 TI
104DimitriCamões 120000VENDAS

Parte da tabela DEPARTAMENTO:

NOME_DEPTOGERENTEORCAMENTO
CONTABILIDADE100300000
TI 101250000
VENDAS 104700000

Neste artigo, também utilizaremos consultas SQL usadas com frequência em empresas: "Obter os nomes dos funcionários que trabalham para o departamento de TI" ou "Obter o número de funcionários em cada departamento com um salário superior a 80.000". Para cada uma dessas consultas, analisaremos a ordem de execução de seus componentes.

Vamos começar com uma simples consulta para obter os nomes dos funcionários do departamento de TI:

SELECT SOBRENOME, NOME
  FROM FUNCIONARIO
 WHERE DEPARTAMENTO = 'TI'

Primeiro, nós executamos a operação FROM na tabela FUNCIONARIO, que retorna os seguintes dados:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
100Tiago Silva 78000 CONTABILIDADE
101Maria Sesamo82000 TI
102Chun Yen 80500 CONTABILIDADE
103Agnes Miller95000 TI
104DimitriCamões 120000VENDAS

Em segundo lugar, executamos WHERE DEPARTAMENTO = 'TI', o que nos dá isto:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
101Maria Sesamo82000TI
103AgnesMiller95000TI

Finalmente, aplicamos SELECT NOME, SOBRENOME, produzindo o resultado final da consulta:

NOMESOBRENOME
Maria Sesamo
AgnesMiller

Ótimo! Após destrincharmos esta consulta, podemos concluir que a ordem de execução para consultas simples com SELECT, FROM e WHERE é:

SELECT, FROM, e WHERE

Mudanças na Ordem de Execução ao Adicionarmos ORDER BY

Suponha que seu chefe receba um relatório baseado na consulta do exemplo anterior e o rejeite, pois os nomes dos funcionários não estão em ordem alfabética. Para consertá-lo, você precisa adicionar uma cláusula ORDER BY à consulta anterior:

  SELECT SOBRENOME, NOME
    FROM FUNCIONARIO
   WHERE DEPARTAMENTO = 'TI'
ORDER BY NOME

O processo de execução desta consulta é quase o mesmo do exemplo anterior. A única diferença está no final, quando a cláusula ORDER BY é processada. O resultado final desta consulta ordena os registros pelo NOME, como mostrado abaixo:

NOMESOBRENOME
AgnesMiller
Maria Sesamo

Portanto, se temos SELECT com FROM, WHERE e ORDER BY, a ordem de execução é:

SELECT com FROM, WHERE e ORDER BY

Adicionando Cláusulas GROUP BY e HAVING à Consulta

Neste exemplo, utilizaremos uma consulta com GROUP BY. Suponhamos que queremos obter quantos funcionários de cada departamento têm um salário superior a 80.000, e queremos o resultado em ordem decrescente pelo número de pessoas em cada departamento. Neste cenário, nossa consulta seria:

  SELECT DEPARTAMENTO, COUNT(*)
    FROM FUNCIONARIOS
   WHERE SALARIO > 80000
GROUP BY DEPARTAMENTO
ORDER BY COUNT(*) DESC

Mais uma vez, nós executamos primeiro FROM FUNCIONARIO, que recupera esses dados:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
100Tiago Silva 78000 CONTABILIDADE
101Maria Sesamo82000 TI
102Chun Yen 80500 CONTABILIDADE
103Agnes Miller95000 TI
104DimitriCamões 120000VENDAS

Em seguida, executamos WHERE SALARIO > 80000, o reduz nosso conjunto de resultados a:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
101Maria Sesamo82000 TI
102Chun Yen 80500 CONTABILIDADE
103Agnes Miller95000 TI
104DimitriCamões 120000VENDAS

Terceiro, aplicamos a cláusula GROUP BY, gerando um registro para cada valor único nas colunas GROUP BY. Em nosso exemplo, criamos um registro para cada valor único em DEPARTAMENTO:

DEPARTAMENTO
CONTABILIDADE
TI
VENDAS

Em quarto lugar, aplicamos SELECT com COUNT(*), produzindo este resultado intermediário:

DEPARTAMENTOCOUNT(*)
CONTABILIDADE1
TI 2
VENDAS 1

Finalmente, aplicamos a cláusula ORDER BY, produzindo o resultado final da consulta:

DEPARTAMENTOCOUNT(*)
TI 2
CONTABILIDADE1
VENDAS 1

A ordem de execução neste exemplo é:

1 - FROM 2 - WHERE 3 GROUP BY 4 - SELECT 5 - ORDER BY

Neste próximo exemplo, acrescentaremos a cláusula HAVING. O uso da cláusula HAVING não é tão comum em SQL como as outras cláusulas que vimos até agora. A melhor maneira de descrever HAVING é que ela funciona como a cláusula WHERE para GROUP BY. Em outras palavras, é uma forma de filtrar ou descartar alguns dos grupos de registros criados como resultado do uso de GROUP BY.

Suponhamos que agora queremos obter todos os departamentos, exceto o departamento de VENDAS, com um salário médio superior a 80.000. A consulta para este caso é:

  SELECT DEPARTAMENTO
    FROM FUNCIONARIOS
   WHERE DEPARTAMENTO <> 'VENDAS'
GROUP BY DEPARTAMENTO
  HAVING AVG(SALARIO) > 80000

Mais uma vez, começamos executando FROM FUNCIONARIO, que retorna estes dados:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
100 Tiago Silva 78000 CONTABILIDADE
101 Maria Sesamo 82000 TI
102 Chun Yen 80500 CONTABILIDADE
103 Agnes Miller 95000 TI
104 Dimitri Camões 120000 VENDAS

Em segundo lugar, executamos a cláusula WHERE, excluindo os registros do departamento de VENDAS:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
100 Tiago Silva 78000 CONTABILIDADE
101 Maria Sesamo 82000 TI
102 Chun Yen 80500 CONTABILIDADE
103 Agnes Miller 95000 TI

Em terceiro lugar, aplicamos a cláusula GROUP BY, gerando os seguintes registros:

DEPARTAMENTOAVG(SALARIO)
CONTABILIDADE 79250
TI 88500

Quarto, HAVING AVG(SALARIO) > 80000 é aplicado para filtrar o grupo de registros gerados pelo GROUP BY:

DEPARTAMENTOAVG(SALARIO)
TI 88,500

Finalmente, a cláusula SELECT é aplicada, produzindo o resultado final da consulta:

DEPARTAMENTO
TI

A ordem de execução neste exemplo é:

1 - FROM, 2 - WHERE, 3 - GROUP BY, 4 - HAVING, 5 - SELECT

Adicionando uma Nova Operação: A Cláusula JOIN

Os exemplos anteriores tratavam de uma tabela. Vamos adicionar uma segunda tabela usando a cláusula JOIN. Suponhamos que queremos obter os sobrenomes e as identificações dos funcionários que trabalham para departamentos com um orçamento superior a 275.000. A consulta para esta situação é:

SELECT ID_FUNCIONARIO, SOBRENOME
  FROM FUNCIONARIOS
  JOIN DEPARTAMENTO
    ON DEPARTAMENTO = NOME_DEPTO
 WHERE ORCAMENTO > 275000

Mais uma vez, nós executamos primeiro FROM FUNCIONARIO, que recupera esses dados:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTO
100Tiago Silva 78000 CONTABILIDADE
101Maria Sesamo82000 TI
102Chun Yen 80500 CONTABILIDADE
103Agnes Miller95000 TI
104DimitriCamões 120000VENDAS

Em segundo lugar, aplicamos a cláusula JOIN, gerando um novo resultado intermediário combinando as duas tabelas:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTONOME_DEPTOGERENTEORCAMENTO
100Tiago Silva 78,000 CONTABILIDADECONTABILIDADE100300000
101Maria Sesamo82,000 TI TI 101250000
102Chun Yen 80,500 CONTABILIDADECONTABILIDADE100300000
103Agnes Miller95,000 TI TI 101250000
104DimitriCamões 120,000VENDAS VENDAS 104700000

Terceiro, a declaração WHERE ORCAMENTO > 275000 é executada:

ID_FUNCIONARIONOMESOBRENOMESALARIODEPARTAMENTONOME_DEPTOGERENTEORCAMENTO
100Tiago Silva78000 CONTABILIDADECONTABILIDADE100300000
102Chun Yen 80500 CONTABILIDADECONTABILIDADE100300000
104DimitriCamões120000VENDAS VENDAS 104700000

Finalmente, SELECT ID_FUNCIONARIO, SOBRENOME é executado, produzindo o resultado final da consulta:

ID_FUNCIONARIOSOBRENOME
100Silva
102Yen
104Camões

A ordem de execução neste exemplo é:

1 - FROM, 2 - JOIN, 3 - WHERE, 4 - SELECT

Considerações Finais

Neste artigo, falamos sobre a ordem de execução em consultas SQL através de exemplos. A partir destes exemplos, podemos ver que existe uma ordem de execução, mas esta ordem pode variar dependendo de quais cláusulas estão presentes na consulta. Como diretriz geral, a ordem de execução é:

1 - FROM, 2 - JOIN, 3 - WHERE, 4 - GROUP BY, 5 - HAVING, 6 - SELECT, 7 - ORDER BY

Entretanto, se uma destas cláusulas não estiver presente, a ordem de execução será diferente. O SQL é uma linguagem fácil, de nível básico, mas com muitos conceitos interessantes a serem explorados. Confira este curso online para conhecer mais a fundo o fascinante mundo do SQL e veja onde ele pode te levar!