Pular para o conteúdo principal
InicioTutoriaisSQL

QUALIFICAR: A instrução de filtragem SQL que você nunca soube que precisava

Saiba mais sobre a cláusula SQL QUALIFY, um método de filtragem essencial, porém menos conhecido, no SQL. Entenda sua sintaxe, usos e como ela difere de outros métodos de filtragem SQL.
abr. de 2024  · 8 min leer

A Structured Query Language (SQL) é uma das linguagens de programação mais importantes do mundo. Essa afirmação é particularmente verdadeira para quem trabalha com dados, pois é a linguagem preferida na comunicação com bancos de dados.

À medida que mais pessoas recorrem aos dados para impulsionar seus negócios, a demanda por conhecimento especializado em SQL só tem aumentado ao longo dos anos. Felizmente, a linguagem é fácil de aprender e está bem estabelecida, o que significa que ela tem uma grande comunidade de usuários para ajudá-lo em caso de dificuldades.

Neste artigo, abordaremos uma cláusula específica da linguagem SQL chamada QUALIFY. Ao final deste artigo, você saberá:

  • O conceito básico e a sintaxe do QUALIFY
  • Quando usar a cláusula QUALIFY
  • Como ele difere de outros métodos de filtragem.

Conceito básico e sintaxe da cláusula SQL QUALIFY

QUALIFY é uma cláusula usada para filtrar os resultados de uma função de janela. Portanto, para usar a cláusula QUALIFY com êxito, deve haver pelo menos uma função WINDOW na lista SELECT ou na cláusula QUALIFY - somente as linhas em que a expressão booleana for avaliada como TRUE serão retornadas.

Dica: Confira a folha de dicas sobre as funções de janela do SQL.

Se não houvesse uma cláusula QUALIFY, a filtragem dos resultados de uma função WINDOW exigiria aninhamento. Normalmente, os desenvolvedores de SQL recomendam não usar consultas aninhadas o máximo possível, pois elas tornam o código menos legível e aumentam a complexidade da depuração e da colaboração.

Em outras palavras, a ideia principal por trás da cláusula QUALIFY era simplificar as consultas que exigem filtragem no resultado das funções de janela; isso significa que a QUALIFY é avaliada depois que as funções de janela são computadas.

Esta é a ordem típica de execução de uma consulta com uma cláusula de declaração QUALIFY:

  • DE
  • ONDE
  • GROUP BY e agregação
  • TER
  • JANELA
  • QUALIFICAR
  • DISTINTO
  • ORDER BY
  • LIMIT

A sintaxe geral de uma instrução QUALIFY é a seguinte:

QUALIFY <predicate>

Em sua forma geral, seria algo parecido com isto:

SELECT <column_list>
  FROM <data_source>
  [GROUP BY ...]
  [HAVING ...]
  QUALIFY <predicate>
  [ ... ]

Observação: <predicado> é uma expressão usada para filtrar o resultado depois que as agregações e as funções de janela são computadas.

Quando usar o SQL QUALIFY

A cláusula de declaração QUALIFY é muito parecida com a cláusula HAVING no sentido de que evita a necessidade de uma subconsulta para realizar a filtragem. Por exemplo, você pode usar QUALIFY para filtrar os resultados de uma função analítica - uma função usada para calcular um valor agregado com base em um grupo de linhas.

Para deixar mais claro quando exatamente você usaria o QUALIFY, aqui está um breve cenário:

Digamos que você esteja trabalhando como cientista de dados e uma parte interessada lhe peça as últimas informações de login de cada cliente. Sua consulta inicial pode ser mais ou menos assim:

SELECT 
  user_id, 
  ip, 
  country_code,
  os,
  RANK() over (
    PARTITION BY user_id ORDER BY log_datetime DESC
  ) as previous_logins
FROM login_logs
WHERE TRUE 

Esse é um bom começo, mas não atende às solicitações das partes interessadas, pois retornará todos os logins e não apenas o mais recente. Para retornar o último login, precisamos adicionar um filtro.

Os recém-chegados ao SQL podem cair na armadilha de tentar filtrar isso usando a cláusula de instrução WHERE, como segue:

SELECT 
  user_id, 
  ip, 
  country_code,
  os,
  RANK() over (
    PARTITION BY user_id ORDER BY log_datetime DESC
  ) AS previous_logins
FROM login_logs
WHERE TRUE 
  AND last_login = 1

Infelizmente, esse código não será executado; o mesmo acontece se você tentar GROUP BY e HAVING.

A razão pela qual isso ocorre é a ordem das operações que discutimos na seção anterior.

WHERE, GROUP BY e HAVING são todos avaliados antes das funções WINDOW; isso significa que eles não podem filtrar as funções WINDOW porque não sabem que elas existem - a função WINDOW não foi avaliada no momento em que essas três cláusulas são executadas.

Uma maneira de fazer o filtro vir depois da função WINDOW é usar uma expressão de tabela comum (CTE).

Veja como ficará nosso código:

WITH 
logins AS (
  SELECT 
      user_id, 
      ip, 
      country_code,
      os,
      RANK() OVER (
        PARTITION BY user_id ORDER BY log_datetime DESC
      ) AS previous_logins
  FROM login_logs
  WHERE TRUE
)

SELECT user_id, ip, country_code, os 
FROM logins
WHERE previous_logins = 1

Tecnicamente falando, esse código é válido - ele será executado perfeitamente bem e retornará os resultados que a parte interessada está buscando.

No entanto, tivemos que introduzir duas consultas e há algumas linhas extras de código, que podem se tornar redundantes se você estiver repetindo esse processo regularmente.

A melhor solução para esse problema é usar o QUALIFY.

Veja como o código será exibido:

-- Starter code from @Jiho Choi on StackOverflow 
SELECT 
  user_id, 
  ip, 
  country_code,
  os,
  RANK() over (
    PARTITION BY user_id ORDER BY log_datetime DESC
  ) as previous_logins
FROM login_logs
WHERE TRUE 
QUALIFY previous_logins = 1

Essa solução funciona porque as cláusulas QUALIFY são avaliadas depois das funções WINDOW na ordem de operações do SQL, o que significa que elas estão cientes de sua existência para que possam filtrá-las na mesma consulta.

Você pode estar se perguntando quais são os benefícios do QUALIFY além de escrever menos linhas de código, e a resposta é que não há realmente nenhum benefício de desempenho.

A solução CTE que usamos e a solução QUALIFY são executadas em períodos de tempo semelhantes, portanto, não podemos dizer que a solução QUALIFY tenha melhorado muito o desempenho.

O principal benefício é a melhoria da qualidade de vida; há menos código e é mais fácil de ler.

Comparação do SQL QUALIFY com outros métodos de filtragem

A esta altura, você já sabe que a cláusula de declaração QUALIFY é outro método de filtragem disponível no SQL. Você também sabe qual é o melhor momento para usar a cláusula QUALIFY.

Mas qual é a diferença entre o QUALIFY e os outros métodos de filtragem?

Vamos recapitular cada método de filtragem.

A cláusula WHERE

WHERE é usado para filtrar registros em uma tabela; isso significa que ele implementa operações de linha. Usamos esse recurso quando queremos extrair os registros que atendem a uma condição específica. Por exemplo, talvez queiramos filtrar um conjunto de dados pela idade de uma pessoa. Veja como ele será exibido no código:

SELECT name, gender, height, weight, age 
FROM gym_members_info 
WHERE age < 23; 

Aqui estão os principais aspectos a serem observados sobre a cláusula WHERE.

  1. É usado para filtrar registros com base em uma condição específica.
  2. As operações são implementadas nas linhas.
  3. Você pode usar a cláusula WHERE sem uma cláusula GROUP BY
  4. WHERE pode ser usado com instruções SELECT, UPDATE, DELETE.

Vamos comparar isso com a cláusula HAVING.

A cláusula HAVING

HAVING é usado para filtrar registros de grupos definidos por uma cláusula GROUP BY com base em uma condição específica. Portanto, a diferença mais significativa entre WHERE e HAVING é que HAVING exige que uma cláusula GROUP BY esteja presente para que seja avaliada com êxito.

A principal vantagem disso é que você pode aplicar sua cláusula HAVING a um subconjunto de grupos agregados, o que não é possível em um bloco WHERE.

Por exemplo:

SELECT gender, AVG(height) 
FROM gym_members_info
GROUP BY gender 
HAVING AVG(height) > 170 

O código acima retornará os grupos de gênero em que a altura média é maior que 170 centímetros; em outras palavras, HAVING implementa uma operação de coluna.

Outro aspecto a ser observado é que o HAVING só pode ser usado com o comando SELECT, ao contrário do WHERE.

A cláusula QUALIFY

QUALIFY é equivalente a HAVING, exceto pelo fato de que ele realiza filtros nos resultados das funções WINDOW, enquanto HAVING realiza filtros em funções agregadas e cláusulas GROUP BY - saiba mais sobre Como usar GROUP BY.

Se quiséssemos saber informações sobre a pessoa mais alta em cada faixa etária, poderíamos usar uma função WINDOW para realizar o cálculo e uma cláusula QUALIFY para filtrar os resultados, de modo a descobrir apenas a pessoa mais alta de cada faixa etária.

Veja como isso ficaria no código:

SELECT name, gender, height, weight, age 
RANK() over (
    PARTITION BY age ORDER BY height DESC
  ) as ranked_ages
FROM gym_members_info
WHERE TRUE
QUALIFY ranked_ages = 1

Essencialmente, a cláusula QUALIFY especifica uma expressão condicional usada para filtrar a saída de uma função analítica ordenada que já foi calculada de acordo com os critérios especificados pelo usuário.

Conclusão e estudos futuros

O SQL desempenha um papel importante no fluxo de trabalho típico da ciência de dados; saber como implementar operações úteis no SQL, como a cláusula QUALIFY, é extremamente útil, pois permite que você escreva um código mais limpo, o que torna mais agradável a colaboração de outras pessoas com você.

Se você quiser dominar suas habilidades em SQL, recomendamos que consulte os recursos abaixo:

Temas

Comece sua jornada SQL hoje mesmo!

Course

Introduction to SQL

2 hr
646.4K
Learn how to create and query relational databases using SQL in just two hours.
See DetailsRight Arrow
Start Course
Veja MaisRight Arrow
Relacionado
SQL Jobs Header

blog

O SQL é uma linguagem de programação?

O SQL é considerado uma linguagem de programação? Analisamos os vários fatores a serem considerados e para que o idioma é usado.
Sejal Jaiswal's photo

Sejal Jaiswal

11 min

blog

Certificação PostgreSQL: Tudo o que você precisa saber

Navegue pela certificação PostgreSQL com a DataCamp. Obtenha habilidades especializadas, conhecimento prático e um caminho para o domínio dos dados.
Matt Crabtree's photo

Matt Crabtree

10 min

tutorial

SELEÇÃO de várias colunas no SQL

Saiba como selecionar facilmente várias colunas de uma tabela de banco de dados em SQL ou selecionar todas as colunas de uma tabela em uma consulta simples.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Como instalar e configurar o MySQL no Docker

Saiba como instalar e configurar o banco de dados MySQL dentro de contêineres do Docker. O tutorial inclui conceitos como conexão com servidores MySQL, execução de clientes MySQL para conexão com contêineres e assim por diante.
Bex Tuychiev's photo

Bex Tuychiev

12 min

tutorial

Tutorial do SQL Server: Desbloqueie o poder do gerenciamento de dados

Explore o gerenciamento de dados com nosso tutorial do SQL Server. Do básico ao uso avançado, aprimore suas habilidades e navegue no SQL Server com confiança.

Kevin Babitz

13 min

tutorial

Tutorial do MySQL: Um guia abrangente para iniciantes

Descubra o que é o MySQL e como começar a usar um dos sistemas de gerenciamento de banco de dados mais populares.
Javier Canales Luna's photo

Javier Canales Luna

15 min

See MoreSee More