Guia do comando SELECT e suas principais cláusulas!

Prepare-se! Esse post vai te dar uma excelente base sobre um dos principais comandos SQL no mundo, talvez o mais popular. Obviamente, estamos falando do comando SELECT!

Antes de tudo, se você caiu de paraquedas nesse post e não sabe nem o que é SQL, recomendo que primeiro você dê uma olhada nesse post que vai te introduzir sobre o assunto, bem como, te apresentar 10 comandos SQL essenciais para iniciantes na área.

Já, se você já possui uma boa base sobre banco de dados e SGBDs, continue lendo o nosso post. Tenho certeza de que você irá gostar e aprender bastante!

Instruções Gerais

Para os exemplos apresentados a seguir, utilizaremos uma estrutura simples de blog:

  • Tabela que conterá as postagens de um blog;
  • Tabela com os dados das imagens;
  • E uma tabela que fará a ligação entre as postagens e as imagens (tabela pivô).

Por uma questão de padronização, nomeamos tabelas e colunas em inglês. Além disso, outro ponto que deve ficar muito claro é o seguinte:

Existem diversos SGBDs (sistemas de gerenciamento de banco de dados) e cada um pode possuir propriedades e sintaxes diferentes. Contudo, a linguagem SQL mantém um padrão entre as diferentes versões, de forma que para cada sistema, é necessário realizar apenas adaptações (na grande maioria dos casos). Para a construção desse artigo, iremos utilizar o SGBD MySQL.

Obs: entretanto, os mesmos comandos apresentados aqui podem precisar de adaptações quando aplicados em outros SGBDs famosos, como o SGBD da Oracle, Microsoft e PostgreSQL, por exemplo.

Sem nos estendermos muito mais, abaixo apresento as tabelas, as estruturas e dados que serão utilizadas para o nosso guia:

Tabelas

1. Tabela blog_posts

A tabela blog_posts contém os dados básicos para as postagens do blog, incluindo um identificador (id), título (title), data da postagem (date), descrição da postagem (post), um campo para dizer se o item deve ser exibido ou não (status), um campo para salvar a url da postagem (slug) e os campos de quando o item foi cadastrado (created_at) e atualizado (updated_at).

Tabela images

A tabela images contém os dados básicos para as imagens, incluindo um identificador (id), nome do arquivo salvo (file_name), nome original do arquivo (original_name) e os campos de quando o item foi cadastrado (created_at) e atualizado (updated_at).

Tabela blog_post_image

A tabela blog_post_image contém a relação entre as postagens e as imagens. Nesta tabela, são salvos os identificadores da postagem (blog_post_id) e da imagem (image_id).

Agora que já temos nossas estruturas e dados no lugar, podemos iniciar o nosso guia do comando SELECT.

O comando SELECT

O comando SELECT é utilizado para extrair os dados das tabelas de um banco de dados. Ele pode extrair dados de uma ou mais tabelas ao mesmo tempo, executando desde simples consultas até comandos mais complexos, fazendo buscas, junções, filtros comparativos, ordenações e diversos outros itens. Abaixo, mostraremos algumas das principais cláusulas para o uso do comando SELECT.

SELECT simples

Começaremos pelo mais simples: retornar os dados de uma tabela. Para isso, utilizaremos o seguinte comando:

No nosso exemplo, extraímos todos os títulos e postagens da tabela blog_posts através do comando:

Veja o resultado abaixo:

Se quisermos, podemos retornar todas as colunas da tabela utilizando o caractere *:

Veja o resultado abaixo:

Para retornar todas as imagens, por exemplo, utilizamos o comando:

Obs: tenha cuidado com o uso do caractere *. Principalmente se você está manipulando dados em um ambiente de produção. O caractere * pode ser traduzido como “todas as colunas” e, em muitos casos, a execução desse comando vai sobrecarregar a performance do seu banco de dados.

Cláusula WHERE

Agora que já sabemos extrair os dados de nossas tabelas de forma simples, podemos começar a adicionar filtros para nossas consultas. A cláusula WHERE é a responsável por filtrar resultados, utilizando parâmetros comparativos como igual, diferente, maior, menor e entre outros. Além disso, podemos usar diversos filtros em nossas consultas, inclusive adicionar parênteses para priorizar consultas dentro de escopos. A cláusula WHERE funciona da seguinte forma:

No nosso exemplo, podemos extrair todos os títulos e postagens da tabela blog_posts onde o status é 1, ou seja, os itens que deveriam ser exibidos no blog. Para isso, utilizamos o comando:

Veja o resultado abaixo:

Perceba que os itens que possuíam um status diferente de 1 foram deixados de fora do resultado da consulta. O propósito da cláusula WHERE é poder extrair os resultados para necessidades específicas.

Por exemplo, se necessitarmos retornar todas as colunas para o item de id 4, utilizaremos o comando:

Veja o resultado abaixo:

Ou se o usuário do blog entrou no link da postagem e precisamos saber qual a postagem relacionada, podemos filtrar utilizando o campo slug:

Veja o resultado abaixo:

Perceba que para condições utilizando texto, devemos utilizar aspas simples para englobá-lo em nossa consulta.

Principais comparativos

Além do comparador de igualdade “=” (exemplificado acima), podemos utilizar diversos outros tipos de comparadores para melhorar a nossa consulta.

Operador comparativo “<>” (diferente)

Para buscar itens que sejam diferentes de algo, podemos utilizar o comparador de diferença “<>”:

Essa busca retornará todos os itens que não possuem o id 5. Veja o resultado abaixo:

Operador comparativo “>” (maior que)

Para buscar itens que sejam maiores que algo, podemos utilizar o comparador “>”:

Essa busca retornará todos os itens que possuem a data maior que 16/09/2016.

Uma possível variação do operador ‘maior que’ é o operador ‘maior ou igual a’, representado pelos caracteres “>=”. Se usássemos o operador ‘maior ou igual a’ no exemplo acima, a consulta iria buscar os posts com data maior que 16/09/2016 e os posts que possuem exatamente essa data.

Operador comparativo “<” (menor que)

Ao contrário do operador apresentado anteriormente, o operador ‘menor que’ irá buscar itens que sejam menores que algo. O operador é representado pelos caracteres “<”. Veja um exemplo de comando com esse operador abaixo:

Essa busca retornará todos os itens que possuem a data menor que 16/09/2016. Da mesma forma que o operador apresentado anteriormente. O operador ‘menor que’ também possui a variação ‘menor ou igual a’.

Operador comparativo “LIKE” (busca parcial de texto)

Para buscar itens que contenham trechos de um texto, podemos utilizar o comparativo LIKE. O comparativo LIKE vem acompanhado de uma máscara de filtro. Essa máscara pode alterar de um SGBD para o outro, nesse exemplo utilizaremos a máscara “%”.

Se por exemplo quisermos buscar uma postagem em que o título inicia com a palavra “Guia”, podemos buscar da seguinte forma:

Veja o resultado abaixo:

Em outros casos, podemos pesquisar por um trecho que se encontra no meio de outras palavras (nem no início, nem no fim do texto). Desta forma, utilizamos a máscara dos dois lados, como no exemplo abaixo:

Essa busca retornará todos os itens que possuírem “oportunidade” em meio à postagem. Veja o resultado abaixo:

Juntando comparativos

Além de tudo que já foi apresentado, ainda podemos utilizar operadores lógicos para refinar ainda mais a nossa consulta. Para isso, existem os operadores “AND”,  “OR” e o uso de parênteses. Todos os filtros utilizados entre parênteses serão executados primeiro, assim como em operações matemáticas.

Operador lógico “AND”

O operador “AND” verifica as condições como um todo e retorna os resultados que atendem a todas as condições. Para buscar postagens que possuem o status 1 “E” a data maior que 21/09/2016, utilizaremos o comando:

Veja o resultado abaixo:

Operador lógico “OR”

O operador “OR” verifica separadamente as condições e retorna os resultados que atendem pelo menos uma das condições. Para buscar postagens que possuem a data maior que 17/10/2016 “OU” menor que 09/09/2016, utilizaremos o comando:

Veja o resultado abaixo:

Uso de parênteses

Os parênteses são utilizados para dar prioridade a uma condição dentro de uma consulta. Se necessitarmos buscar postagens que foram feitas após o dia 17/10/2016, independentemente de seu status e, além disso, buscarmos notícias mais antigas somente com o status ativo, faremos da seguinte forma:

Veja o resultado abaixo:

Cláusula ORDER BY

Hora de ordenar os nossos resultados com a cláusula ORDER BY. Inicialmente, vamos ordenar de modo ascendente (ASC) e depois de forma descendente (DESC). A cláusula ORDER BY deve ser inserida após as cláusulas anteriores. Não ficou claro? Então dá uma olhada em nossos próximos exemplos!

Modo ascendente (ASC)

O modo ascendente (ASC) é o padrão do ORDER BY. Portanto, nem é necessário estar explicito no comando. Contudo, por razões didáticas, iremos mostrar dois comandos que são diferentes, mas que retornam os mesmos resultados devido essa particularidade do modo ascendente (ASC). Veja abaixo:

ou

Em ambos, os resultados retornados são todas as postagens com o status 1, ordenadas pelo seu id, de forma ascendente. Veja abaixo:

Modo descendente (DESC)

Em blogs, a última postagem é sempre a que fica em primeiro lugar na lista. Para essa funcionalidade, utilizaremos a ordenação descendente através da data como referência:

Veja os resultados abaixo:

Junção de tabelas

Parabéns, você chegou até aqui, aposto que você já estourou a sua quota de conhecimentos pelo dia, mas para ficar completo, ainda há mais conteúdo pela frente. Então faz um esforço final que já está nos ‘finalmente’. Bom, agora que você já sabe buscar, filtrar e ordenar nossos resultados, chegou o momento de unirmos diferentes tabelas em uma só consulta. Um exemplo de aplicação desse recurso seria trazer postagens do blog juntamente com as suas imagens relacionadas.

Para isso, no comando SELECT, precisamos utilizar o prefixo das tabelas para especificar quais campos desejamos trazer. Veja a sintaxe a seguir:

Para exemplificar, vamos fazer uma consulta simples utilizando duas tabelas. Utilizaremos nossa tabela blog_posts e blog_post_image para descobrir quais imagens estão relacionadas com cada postagem. Nessa consulta, retornaremos o id e título da postagem, além do id das imagens relacionadas. Veja o comando a seguir:

A tabela blog_post_image contém os ids de referência tanto para a postagem, quanto para a imagem. Essa tabela é responsável por ligar uma a outra. Com uma simples consulta, identificamos os ids das imagens para cada postagem.

Aliás e Tabelas

É importante perceber que na cláusula FROM colocamos todas as tabelas que são referenciadas. Cada vez que precisamos utilizar uma coluna, precisaremos acrescentar como prefixo o nome da tabela. Para consultas maiores, isso pode ficar muito repetitivo. Pensando nisso, podemos usar um “alias”. O aliás (ou pseudônimo) serve para criar uma chave única que referencia a tabela, facilitando o entendimento e a manutenção das consultas. A consulta acima, utilizando pseudônimos (alias), ficaria assim:

Obs: podemos utilizar qualquer palavra como aliás, porém, ela precisa ser única para cada tabela.

Último exemplo!

No nosso último exemplo desse post, faremos uma consulta que utiliza a tabela de junção (tabela pivô) blog_post_image para retornar o id, data e o título da postagem, juntamente com o nome dos arquivos de imagem relacionados. Seguiremos o mesmo padrão da consulta anterior. Contudo, agora iremos adicionar uma tabela a mais na cláusula e uma condição extra. Veja o comando abaixo:

Com esse comando, conseguimos consultar todas as postagens que possuem uma ou mais imagens relacionadas, junto a seus respectivos nomes de arquivos de imagem.

Observe que, utilizando a condição de igualdade, a consulta retorna somente as postagens que possuem uma ou mais imagens relacionadas. Se necessitarmos incluir resultados que não possuem imagens, necessitamos utilizar o comando JOIN.

(Calma! Não se desespere! Ensinaremos o comando JOIN em outro post)

Concluindo

Por hoje vamos ficando por aqui. Tenho certeza que você já tem muita informação para um dia só. Principalmente se você está iniciando na área de desenvolvimento ou mesmo como um DBA novato. Já, se você é “macaco véio”, talvez o artigo não tenha trazido muitas novidades para você, pois realmente a ideia inicial era dar uma força extra para quem está dando os seus primeiros passos na área.

Se você gostou e quer mais conteúdo sobre banco de dados, dê uma olhada em nosso treinamento completo sobre banco de dados MySQL e linguagem SQL. Tenho certeza que você irá gostar e aprender muito. No mais, eu realmente espero que esse post tenha ajudado você. Fique a vontade para falar conosco nos comentários abaixo.

Críticas, elogios, sugestões, o que vier a cabeça. Iremos adorar ouvir de você. Abraços e até a próxima!

 

Curso Online de Introdução a Banco de Dados Relacionais e SQL da Becode

Written by Alysson Zanette

Principal responsável pelo desenvolvimento back-end do LMS Becode. Na Becode e TargetTrust, atua como DevOps, profissional responsável por criar o elo entre a área de desenvolvimento e a infraestrutura de TI. Hoje é reconhecido como uma das principais referências técnicas de ambas instituições de ensino, onde também atua como instrutor das linhas de formação em TI!

6 habilidades essenciais para conseguir um freela na TI | Becode

6 habilidades essenciais para conseguir um freela na TI

Ser programador no exterior? Veja 5 dicas para tornar isso realidade!

Ser programador no exterior? 5 dicas para tornar isso realidade!