Curso SQL — PARTE 3
Exploração de dados em uma única tabela
O primeiro passo na nossa descoberta do SQL é o comando SELECT. Como o próprio nome diz ele seleciona coisas, mas o que são essas coisas? A resposta é: Colunas!
Em um mesmo banco de dados, assim como no Excel, eu posso colunas com o mesmo nome em diferentes tabelas. Por isso, é importante eu declarar também de onde eu estou selecionando essas colunas. Nesse caso eu utilizo o comando FROM.
Para buscar então no banco de dados as colunas nome e telefone da tabela alunos o comando fica da seguinte forma:
SELECT nome
,telefone
FROM alunosÉ importante notar alguns detalhes sobre a maneira como escrevemos o código (sintaxe). Note que uma vírgula separa os dois campos (nome e telefone). Essa vírgula deve sempre separar os campos. Por exemplo, se os campos de interesse fossem nome, sobrenome e telefone a query ficaria:
SELECT nome
,sobrenome
,telefone
FROM alunosPara verificar que esses códigos funcionam, copie e cole na parte à direita do sql fiddle e depois clique em Run SQL. A figura abaixo mostra o resultado:
IMPORTANTE: certifique-se que todos os passos do capítulo anterior foram seguidos corretamente, ou seja, que existe uma tabela alunos criada.
Exercício Proposto: Faça uma query que retorna todas as colunas da tabela alunos.
Outra forma simples de retornar todas as colunas da tabela, sem precisar digitar o nome de cada uma das colunas é usar um * no lugar das colunas. Experimente o comando a seguir e observe o resultado:
SELECT * FROM alunosEsse comando vai retornar todos os registros, ou seja todas as linhas de todas as colunas da tabela alunos.
Sabemos que esse arquivo tem apenas 7 registros, mas se não soubéssemos iriamos correr o risco de buscar no banco de dados uma tabela com muitos registros e isso poderia atrapalhar a execução da query em si e de outros colegas.
Sendo assim, vamos aprender agora um outro comando que limita o número de registros retornados pela query. Esse comando é o LIMIT. Vamos aplicá-lo sobre a query anterior para que ela traga apenas 3 registros.
SELECT * FROM alunos
LIMIT 3O resultado pode ser visto abaixo:
Ao rodar na sua máquina pode ser que os registros retornados não sejam os mesmos que o meu, mas você deverá ter apenas 3 registros (3 linhas da tabela).
Exercício Proposto: Faça uma query que retorna cinco registros com todas as colunas da tabela alunos.
Imagine agora que você queira renomear durante a sua busca a coluna telefone mudando-a para telefone_aluno. Isso seria possível? A resposta é SIM! Mas lembre-se, o nome da coluna não muda no banco de dados. Ele vai mudar APENAS no resultado da sua coluna.
Para realizar essa mudança vamos usar o comando AS. A query fica da seguinte maneira:
SELECT nome
,sobrenome
,telefone AS “telefone_aluno”
FROM alunosNote que o AS vem logo em seguida da coluna que se deseja renomear e colocamos o novo nome da coluna entre aspas duplas. Outro fator importante é que não pode haver espaço entre as palavras, por isso colocamos underline quando precisamos separar palavras.
Exercício Proposto: Faça uma query que retorna as colunas nome e telefone da tabela alunos porém renomeadas para name e phone respectivamente.
Até aqui modificamos apenas o nome da coluna e usamos os dados de cada coluna sem nenhuma transformação. Há casos no dia a dia de um analista de dados onde é preciso fazer alterações pontuais ou em massa nos dados que estamos lendo. Para isso podemos utilizar o comando CASE WHEN + THEN. Como o próprio nome diz, em casos quando uma situação acontece então o resultado será naquela coluna será outro.
Vamos a um exemplo de aplicação. Suponha que queremos ler a tabela alunos, porém percebemos que existem casos onde a cidade_res está escrita incorretamente, como é o caso de São Paulo que na coluna está como Sao Paulo. A query ficaria da seguinte maneira:
SELECT id
,nome
,sobrenome
,telefone
,CASE
WHEN cidade_res = “Sao Paulo” THEN “São Paulo”
ELSE cidade_res END AS “cidade_res_tratada”
FROM alunosO comando CASE WHEN verifica se cidade_res = “Sao Paulo” e quando essa condição for verdadeira ele substitui por “São Paulo”. Se a condição não for verdadeira (ELSE) ele retorna a própria cidade_res e finalizamos o comando com a palavra END. Por fim damos um nome a essa coluna usando o comando AS.
Exercício Proposto: Faça uma query que retorna os nomes de cidade_res corrigidos para as cidades de “Sao Paulo” e “Jundiai”. O nome correto para essas cidades são “São Paulo” e “Jundiaí” respectivamente. Renomeie a coluna para cidade_res_corrigida.
Durante a leitura dos dados é muito comum querermos mudar o tipo do dado daquela coluna. Vamos a um exemplo. Se fosse necessário adicionar um 0 na frente do telefone durante a leitura isso não seria possível, pois 0’s à esquerda são ignorados em colunas do tipo int.
Get Yuri Veiga’s stories in your inbox
Join Medium for free to get updates from this writer.
Em um paralelo com Excel seria o mesmo que tentar digitar, por exemplo, 010 em uma célula do tipo número. O Excel corrige automaticamente o valor para 10.
Em SQL para conseguirmos realizar esse tipo de operação precisaríamos mudar o tipo da coluna telefone de INT para CHAR durante a leitura “CAST(telefone AS CHAR)”. Estamos lendo o número de telefone como texto e não mais como número.
Posteriormente, concatenamos (juntamos) o zero como texto (“0”) e o texto telefone usando a função CONCAT que fica na forma CONCAT(“0”, CAST(telefone AS CHAR)). Por fim, renomeamos a coluna como telefone_text.
SELECT id
,nome
,sobrenome
,CONCAT(“0”, CAST(telefone AS CHAR)) AS “telefone_text”
FROM alunosExercício Proposto: Faça uma query que retorna os id’s da tabela alunos com dois zeros no final. A linha que originalmente tinha id 1 deve ficar com id 100. Ao final, renomeie a coluna para id_mod.
No Excel conseguimos resumir os dados por meio de tabelas dinâmicas. No SQL não temos uma tabela dinâmica, mas também conseguimos resumir os dados. Vamos usar as funções de agregação e agrupamento do SQL.
Inicialmente vamos começar contando o número de linhas da tabela alunos. Para isso vamos usar a função count().
SELECT COUNT(*) AS “num_registros”
FROM alunosRecapitulando, até esse momento já passamos por alguns comandos que realizam ações. São eles CASE WHEN, CAST, COUNT. Esses comando fazem parte da lista de funções e operadores disponíveis para o mysql 5.6. Nesse curso vamos abordar as mais comuns, mas você pode ter acesso à uma lista completa dessas funções no site clicando aqui.
Ao construir uma tabela no Excel, conseguimos filtrar seus elementos por coluna e aqui em SQL não é diferente!
Vamos conhecer agora o comando WHERE que serve como filtro em uma query. Ele é posicionado após a declaração das origens de dados. Veja o exemplo de aplicação:
SELECT *
FROM alunos
WHERE nome = “Albert”O resultado dessa query traz todas as linhas da tabela alunos cujo nome do aluno é Albert.
Podemos usar intervalos também no filtro.
SELECT *
FROM alunos
WHERE id > 0 AND id < 50No exemplo anterior utilizamos o comando WHERE associado ao operador lógico AND. Isso quer dizer que para o registro aparecer no resultado dessa nossa busca, seu ID deve ao mesmo tempo satisfazer as duas condições maior que 0 E menor que 50. Em outras palavras estamos buscando registros com id de 1 à 49.
As vezes queremos filtrar registros que obedecem à uma OU outra condição. Nesse caso utilizamos o operador lógico OR. Para ilustrar, vamos dizer que estamos interessados nos registros cujo id é menor que 50 OU tem a cidade = Goiânia. A query fica então na seguinte forma:
SELECT *
FROM alunos
WHERE id < 50 OR cidade_res = “Goiânia”No exemplo anterior colocamos Goiânia entre aspas, mas o número 50 não. Temos um motivo para isso! O número 50 é um inteiro e por isso não precisa ser colocado entre aspas na comparação, já o campo cidade_res é do tipo VARCHAR e por isso deve ser filtrado por uma estrutura VARCHAR. Para marcarmos um VARHCAR em sql colocamos entre aspas.
Abstraindo um pouco o conceito, quando fazemos um filtro utilizando WHERE temos que garantir que a coluna filtrada e o valor para o filtro são do mesmo tipo.
É importante ressaltar que o comando WHERE opera sobre colunas que já existem na tabela. Caso fosse necessário fazer um filtro em alguma coluna criada no contexto da Query precisaríamos utilizar o comando HAVING no lugar do WHERE.
SELECT cidade_res
,CONCAT(“00”, CAST(telefone AS CHAR)) AS “tel_char”
FROM alunos
HAVING tel_char = “0011223456”Se usássemos o comando WHERE na query anterior ele não funcionaria já que a coluna tel_char existe apenas no contexto da query e não é uma coluna do banco de dados.
Exercício Proposto: Faça uma query que retorna todas as linhas e colunas da tabela alunos em que o id esteja entre 100 e 500.
Exercício Proposto: Faça uma query que retorna todas as linhas e colunas da tabela alunos em que o id esteja entre 100 e 200 OU que o nome do aluno seja Max.
Exercício Proposto: Faça uma query que retorna a coluna nome, porém cada registro deve ser convertido para letras maiúsculas. Renomeie essa coluna de nome_maiusculo. DICA: Use a função UPPER() conforme link
Partindo da query anterior, filtre a coluna nome_maiusculo de maneira a selecionar os seguintes nomes: MAX, ALBERT e NIKOLA.
DICA: Lembre-se que a coluna nome_maiusculo não é original do banco de dados e por isso o where não funciona!
Ao construir uma tabela dinâmica no Excel, conseguimos agrupar a contagem de elementos por uma ou mais colunas. Para isso utilizamos a função GROUP BY. Para agrupar os dados é necessário que a coluna pela qual vamos agregar esteja entre as selecionadas.
SELECT cidade_res
,count(*) AS “num_alunos_por_cidade”
FROM alunos
GROUP BY cidade_resO comando GROUP BY aparece no final da query e contém as colunas separadas por vírgulas que iremos utilizar para o agrupamento.
Ao resumir os dados, seja por um count(), sum() ou outra função de agregação usamos o GROUP BY para indicar as colunas pelas quais iremos resumir.
Exercício Proposto: Faça uma query que conta o número de alunos por cidade.
Exercício Proposto: Faça uma query que conta o número de alunos distintos por cidade. DICA: A função count admite associação com a função distinct. A documentação do distinct pode ser encontrada no link.
Até aqui aprendemos como extrair dados de a partir de uma única tabela, mas a beleza do SQL se deve em grande parte ao cruzamento de dados entre diferentes tabelas e esse assunto será abordado na PARTE 4 do curso.







