Introdução
As linguagens de programação geralmente apresentam instruções condicionais, que são comandos que executam uma ação específica até que uma determinada condição seja atendida. Uma instrução condicional comum é a declaração if, then, else
, que geralmente segue esta lógica:
if condition=true
then action A
else action B
A lógica desta declaração se traduz na seguinte linguagem: “Se a condição for verdadeira, então execute a ação A. Caso contrário (else), execute a ação B.”
As expressões CASE
são um recurso na Linguagem de Consulta Estruturada (SQL) que permitem aplicar lógica semelhante a consultas de banco de dados e definir condições sobre como deseja retornar ou exibir os valores em seu conjunto de resultados.
Neste tutorial, você aprenderá a usar a expressão CASE
para definir condições em seus dados usando as palavras-chave WHEN
, THEN
, ELSE
e END
.
Pré-requisitos
Para completar este tutorial, você precisará de:
- A server running Ubuntu 20.04, with a non-root user with
sudo
administrative privileges and firewall enabled. Follow our Initial Server Setup with Ubuntu 20.04 to get started. - MySQL instalado e seguro no servidor. Siga nosso guia Como Instalar o MySQL no Ubuntu 20.04 para configurar isso. Este guia pressupõe que você também configurou um usuário MySQL não root, conforme descrito no Passo 3 deste guia.
Observação: Por favor, note que muitos sistemas de gerenciamento de banco de dados relacionais usam suas próprias implementações únicas de SQL. Embora os comandos descritos neste tutorial funcionem na maioria dos SGBDRs, a sintaxe exata ou a saída podem ser diferentes se você testá-los em um sistema que não seja o MySQL.
Para praticar o uso de expressões CASE
neste tutorial, você precisará de um banco de dados e tabela carregados com dados de exemplo. Se você não tiver um pronto para inserir, você pode ler a seguinte seção Conectando-se ao MySQL e Configurando um Banco de Dados de Exemplo para aprender como criar um banco de dados e tabela. Este tutorial fará referência a este banco de dados de exemplo e tabela ao longo.
Conectando-se ao MySQL e Configurando um Banco de Dados de Exemplo
Se o seu banco de dados SQL estiver em um servidor remoto, faça SSH para o seu servidor a partir da sua máquina local:
Em seguida, abra o prompt do MySQL, substituindo sammy
pelas informações da sua conta de usuário MySQL:
Crie um banco de dados chamado caseDB
:
Se o banco de dados foi criado com sucesso, você receberá a seguinte saída:
OutputQuery OK, 1 row affected (0.01 sec)
Para selecionar o banco de dados caseDB
, execute a seguinte instrução USE
:
OutputDatabase changed
Após selecionar o banco de dados, crie uma tabela dentro dele. Para os exemplos deste tutorial, vamos criar uma tabela que armazena dados sobre os dez álbuns mais vendidos de todos os tempos. Esta tabela terá as seguintes seis colunas:
music_id
: exibe os valores do tipo de dadosint
e servirá como a chave primária da tabela, significando que cada valor nesta coluna funcionará como um identificador único para sua respectiva linha.artist_name
: armazena o nome de cada artista utilizando o tipo de dadosvarchar
com um máximo de 30 caracteres.album_name
: utiliza o tipo de dadosvarchar
, novamente com um máximo de 30 caracteres, para armazenar os nomes de cada álbum.release_date
: acompanha a data de lançamento de cada álbum utilizando o tipo de dadosDATE
, que utiliza o formato de dataYYYY-MM-DD
.genre_type
: exibe a classificação de gênero para cada álbum utilizando o tipo de dadosvarchar
com um máximo de 25 caracteres.copies_sold
: utiliza o tipo de dadosdecimal
para armazenar o número total de cópias de álbuns vendidas em milhões. Esta coluna especifica uma precisão de quatro com uma escala de um, significando que os valores nesta coluna podem ter quatro dígitos, com um desses dígitos à direita do ponto decimal.
Crie uma tabela chamada top_albums
que contenha cada uma dessas colunas executando o seguinte comando CREATE TABLE
:
Em seguida, insira alguns dados de exemplo na tabela vazia:
OutputQuery OK, 10 rows affected (0.01 sec)
Records: 10 Duplicates: 0 Warnings: 0
Depois de inserir os dados, você estará pronto para começar a usar expressões CASE
em SQL.
Compreendendo a Sintaxe da Expressão CASE
As expressões CASE
permitem que você defina condições para seus dados e use lógica semelhante a instruções if-then
para pesquisar seus dados, comparar os valores e avaliar se eles correspondem como “verdadeiros” às condições que você definiu. Aqui está um exemplo da sintaxe geral para uma expressão CASE
:
. . .
CASE
WHEN condition_1 THEN outcome_1
WHEN condition_2 THEN outcome_2
WHEN condition_3 THEN outcome_3
ELSE else_outcome
END
. . .
Dependendo de quantas condições você deseja definir para seus dados, você também incluirá as seguintes palavras-chave dentro de uma expressão CASE
:
WHEN
: esta palavra-chave avalia e compara os valores de dados que você tem em sua tabela contra as condições ou critérios que você definiu.WHEN
é comparável aoif
em uma instruçãoif-then-else
típica.THEN
: esta palavra-chave filtra através de cada condição que você pode ter definido se um valor particular não atender aos critérios.SENÃO
: se o valor dos dados não atender a nenhuma das condições que você definiu após passar por cada declaraçãoQUANDO
eENTÃO
, então esta palavra-chave pode ser usada para especificar a condição final sob a qual ela pode ser categorizada.FIM
: para executar com sucesso a expressãoCASE
e definir suas condições, você deve terminar com a palavra-chaveFIM
.
Com este entendimento da estrutura e sintaxe da expressão CASE
, você está pronto para começar a praticar com os dados de exemplo.
Usando Expressões CASE
Imagine que você é um DJ preparando uma lista de músicas para a celebração do 65º aniversário da sua excêntrica tia Carol. Você sabe que o gosto dela é difícil de definir, então decide fazer alguma pesquisa sobre os dez álbuns mais vendidos de todos os tempos para informar algumas de suas decisões musicais.
Primeiro, revise a lista que você compilou na tabela top_albums
executando SELECT
e o símbolo *
para visualizar todos os dados de cada coluna:
Output+----------+-----------------+-------------------------------+--------------+------------------+-------------+
| music_id | artist_name | album_name | release_date | genre_type | copies_sold |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
| 1 | Michael Jackson | Thriller | 1982-11-30 | Pop | 49.2 |
| 2 | Eagles | Hotel California | 1976-12-08 | Soft Rock | 31.5 |
| 3 | Pink Floyd | The Dark Side of the Moon | 1973-03-01 | Progressive Rock | 21.7 |
| 4 | Shania Twain | Come On Over | 1997-11-04 | Country | 29.6 |
| 5 | AC/DC | Back in Black | 1980-07-25 | Hard Rock | 29.5 |
| 6 | Whitney Houston | The Bodyguard | 1992-11-25 | R&B | 32.4 |
| 7 | Fleetwood Mac | Rumours | 1977-02-04 | Soft Rock | 27.9 |
| 8 | Meat Loaf | Bat Out of Hell | 1977-10-11 | Hard Rock | 21.7 |
| 9 | Eagles | Their Greatest Hits 1971-1975 | 1976-02-17 | Country Rock | 41.2 |
| 10 | Bee Gees | Saturday Night Fever | 1977-11-15 | Disco | 21.6 |
+----------+-----------------+-------------------------------+--------------+------------------+-------------+
10 rows in set (0.00 sec)
Como a tia Carol nasceu em 1957, ela curtiu muitos sucessos das décadas de setenta e oitenta em sua juventude. Você sabe que ela é uma grande fã de pop, soft rock e disco, então quer classificar esses como a maior prioridade em sua lista de músicas.
Você pode fazer isso usando a expressão CASE
para definir uma condição de “Alta Prioridade” para aqueles gêneros específicos ao consultar os valores de dados sob a coluna genre_type
. A seguinte consulta faz isso e cria um alias para a coluna resultante criada pela expressão CASE
, nomeando-a como prioridade
. Esta consulta também inclui artist_name
, album_name
e release_date
para mais contexto. Não se esqueça de usar a palavra-chave END
para completar sua expressão CASE
completa:
Output+-----------------+-------------------------------+--------------+---------------+
| artist_name | album_name | release_date | priority |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller | 1982-11-30 | High Priority |
| Eagles | Hotel California | 1976-12-08 | High Priority |
| Pink Floyd | The Dark Side of the Moon | 1973-03-01 | NULL |
| Shania Twain | Come On Over | 1997-11-04 | NULL |
| AC/DC | Back in Black | 1980-07-25 | NULL |
| Whitney Houston | The Bodyguard | 1992-11-25 | NULL |
| Fleetwood Mac | Rumours | 1977-02-04 | High Priority |
| Meat Loaf | Bat Out of Hell | 1977-10-11 | NULL |
| Eagles | Their Greatest Hits 1971-1975 | 1976-02-17 | NULL |
| Bee Gees | Saturday Night Fever | 1977-11-15 | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)
Embora esta saída reflita as condições que você definiu para aqueles tipos de gênero de Alta Prioridade
, como você omitiu a palavra-chave ELSE
, isso resulta em valores de dados desconhecidos ou ausentes conhecidos como valores NULL
. Enquanto a palavra-chave ELSE
pode não ser necessária se seus valores de dados atenderem a todas as condições que você definiu na expressão CASE
, ela é útil para qualquer dado residual para que possa ser categorizado adequadamente sob uma única condição.
Para esta próxima consulta, escreva a mesma expressão CASE
, mas desta vez defina uma condição com a palavra-chave ELSE
. No exemplo a seguir, o argumento ELSE
rotula quaisquer valores de dados não de alta prioridade para genre_type
como “Talvez”:
[sceondary_label Output]
+-----------------+-------------------------------+--------------+---------------+
| artist_name | album_name | release_date | priority |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller | 1982-11-30 | High Priority |
| Eagles | Hotel California | 1976-12-08 | High Priority |
| Pink Floyd | The Dark Side of the Moon | 1973-03-01 | Maybe |
| Shania Twain | Come On Over | 1997-11-04 | Maybe |
| AC/DC | Back in Black | 1980-07-25 | Maybe |
| Whitney Houston | The Bodyguard | 1992-11-25 | Maybe |
| Fleetwood Mac | Rumours | 1977-02-04 | High Priority |
| Meat Loaf | Bat Out of Hell | 1977-10-11 | Maybe |
| Eagles | Their Greatest Hits 1971-1975 | 1976-02-17 | Maybe |
| Bee Gees | Saturday Night Fever | 1977-11-15 | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)
Esta saída agora é muito mais representativa das condições que você definiu para aqueles álbuns com prioridade máxima e aqueles sem ela. Mesmo que isso ajude a priorizar os quatro principais álbuns — Thriller
, Hotel California
, Rumours
e Saturday Night Fever
— você está convencido de que precisa haver mais variedade neste repertório. Mas você terá que convencer a Tia Carol disso também.
Você decide fazer um pequeno experimento e pedir à Tia Carol para ampliar seu repertório musical e ouvir os álbuns restantes. Você não fornece nenhum contexto sobre os álbuns e instrui-a a pontuá-los honestamente como “Relaxante”, “Divertido” ou “Entediante”. Depois que ela termina, ela lhe entrega uma lista escrita à mão com suas pontuações. Agora você tem as informações de que precisa para definir as condições para sua consulta da seguinte forma:
Output
+-----------------+-------------------------------+--------------+---------------+
| artist_name | album_name | release_date | score |
+-----------------+-------------------------------+--------------+---------------+
| Michael Jackson | Thriller | 1982-11-30 | High Priority |
| Eagles | Hotel California | 1976-12-08 | High Priority |
| Pink Floyd | The Dark Side of the Moon | 1973-03-01 | Fun |
| Shania Twain | Come On Over | 1997-11-04 | Fun |
| AC/DC | Back in Black | 1980-07-25 | Boring |
| Whitney Houston | The Bodyguard | 1992-11-25 | Boring |
| Fleetwood Mac | Rumours | 1977-02-04 | High Priority |
| Meat Loaf | Bat Out of Hell | 1977-10-11 | Boring |
| Eagles | Their Greatest Hits 1971-1975 | 1976-02-17 | Mellow |
| Bee Gees | Saturday Night Fever | 1977-11-15 | High Priority |
+-----------------+-------------------------------+--------------+---------------+
10 rows in set (0.00 sec)
Com base nessa saída, a Tia Carol parece aberta a novos sons, e você fica agradavelmente surpreso com sua pontuação para Pink Floyd. Mas você está um pouco desapontado com sua falta de interesse nas excelentes músicas de AC/DC, Meat Loaf e Whitney Houston.
A Tia Carol pode ser mais flexível se você mostrar a ela que alguns álbuns são objetivamente mais populares do que outros, então você decide trazer alguns números para influenciar a decisão. O fato é que estes são os dez melhores álbuns porque venderam milhões de cópias para fãs ao longo das décadas. Portanto, para esta próxima consulta, você criará uma nova expressão CASE
que define uma pontuação com base nos dados numéricos de cópias_vendidas
dos álbuns vendidos até agora.
Você usará a expressão CASE
para definir condições para álbuns que vendem pelo menos 35 milhões de cópias como “melhores”, aqueles com 25 milhões como “excelentes”, aqueles com 20 milhões como “bons” e qualquer coisa abaixo disso como “medíocre”, como no exemplo a seguir:
Output+-----------------+-------------------------------+--------------+-------+
| artist_name | album_name | release_date | score |
+-----------------+-------------------------------+--------------+-------+
| Michael Jackson | Thriller | 1982-11-30 | best |
| Eagles | Hotel California | 1976-12-08 | great |
| Pink Floyd | The Dark Side of the Moon | 1973-03-01 | good |
| Shania Twain | Come On Over | 1997-11-04 | great |
| AC/DC | Back in Black | 1980-07-25 | great |
| Whitney Houston | The Bodyguard | 1992-11-25 | great |
| Fleetwood Mac | Rumours | 1977-02-04 | great |
| Meat Loaf | Bat Out of Hell | 1977-10-11 | good |
| Eagles | Their Greatest Hits 1971-1975 | 1976-02-17 | best |
| Bee Gees | Saturday Night Fever | 1977-11-15 | good |
+-----------------+-------------------------------+--------------+-------+
10 rows in set (0.00 sec)
Com base nessa saída, nenhum álbum foi classificado como “medíocre”, pois cada um deles vendeu mais de 20 milhões de cópias. No entanto, existem alguns álbuns que se destacam entre os demais com base nas pontuações. Agora você pode fornecer à tia Carol evidências sólidas para ouvir AC/DC ou Whitney Houston, já que seus álbuns venderam mais de 25 milhões de cópias, tornando-os duas das maiores obras musicais por aí.
Agora você tem uma compreensão de como usar a expressão CASE
para definir condições para vários propósitos e com valores de dados característicos e numéricos. Além disso, como o CASE
usa a lógica if-then
para comparar esses valores e gerar as respostas com base nas condições desejadas.
Conclusão
Compreender como usar a expressão CASE
pode ajudar a filtrar seus dados de acordo com as condições que você definir. Se você deseja definir prioridades diferentes para determinados valores ou atribuir pontuações com base em critérios de opinião popular ou números, isso é flexível às suas necessidades. Se você deseja aprender sobre outras maneiras de manipular os valores de dados em seus conjuntos de resultados, confira nosso guia sobre funções de CAST
e expressões de concatenação.
Source:
https://www.digitalocean.com/community/tutorials/how-to-use-case-expressions-in-sql