12th Sep 2022 6 minutos de leitura Ordem de Operações SQL Ignacio L. Bisso sql aprender sql noções básicas de sql Índice Seis operações para ordenar: SELECT, FROM, WHERE, GROUP BY, HAVING e ORDER BY Banco de dados de funcionários Mudanças na Ordem de Execução ao Adicionarmos ORDER BY Adicionando Cláusulas GROUP BY e HAVING à Consulta Adicionando uma Nova Operação: A Cláusula JOIN Considerações Finais 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 é: 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 é: 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 é: 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 é: 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 é: 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 é: 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! Tags: sql aprender sql noções básicas de sql