Dominando Consultas SQL Avançadas no MySQL

O MySQL é um dos sistemas de gerenciamento de bancos de dados relacionais (SGBDR) mais populares do mundo, e o domínio de suas instruções SQL é crucial para qualquer desenvolvedor ou administrador de banco de dados. Este guia explora comendos SQL avançados e funções que permitem manipular e consultar dados de forma mais eficaz, cobrindo desde a seleção básica com filtros complexos até junções, subconsultas e funções úteis.

Fundamentos de Seleção e Filtragem de Dados

Cláusula SELECT

A instrução SELECT é a base de todas as consultas SQL, utilizada para recuperar dados de uma ou mais tabelas. É possível selecionar todas as colunas ou apenas as específicas que você precisa.

Sintaxe: SELECT coluna1, coluna2 FROM nome_da_tabela;

-- Seleciona todas as colunas da tabela Alunos
SELECT * FROM Alunos;

-- Seleciona apenas as colunas nome_completo e idade da tabela Alunos
SELECT nome_completo, idade FROM Alunos;

-- Seleciona somente a coluna nome_completo
SELECT nome_completo FROM Alunos;

Modificador DISTINCT

Para eliminar linhas duplicadas do resultado de uma consulta, utilize a palavra-chave DISTINCT. Isso é particularmente útil quando você deseja ver os valores únicos em uma coluna.

Sintaxe: SELECT DISTINCT coluna FROM nome_da_tabela;

-- Retorna todas as idades únicas presentes na tabela Alunos
SELECT DISTINCT idade FROM Alunos;

Cláusula WHERE

A cláusula WHERE permite filtrar registros com base em condições específicas, garantindo que apenas as linhas que satisfazem essas condições sejam retornadas pela consulta.

Sintaxe: SELECT coluna FROM nome_da_tabela WHERE condicao;

-- Seleciona o nome e a idade de alunos com menos de 21 anos
SELECT nome_completo, idade FROM Alunos WHERE idade < 21;

-- Seleciona todos os detalhes de alunos do sexo feminino
SELECT * FROM Alunos WHERE genero = 'F';

Operadores Lógicos: AND, OR

Para combinar múltiplas condições na cláusula WHERE, utilizamos os operadores lógicos AND e OR. AND exige que todas as condições sejam verdadeiras, enquanto OR exige que pelo menos uma condição seja verdadeira.

Sintaxe: SELECT coluna FROM nome_da_tabela WHERE condicao1 AND condicao2 OR condicao3;

-- Seleciona alunos do sexo masculino com idade superior a 21
SELECT * FROM Alunos WHERE genero = 'M' AND idade > 21;

-- Seleciona alunos com idade superior a 23 OU inferior a 20
SELECT * FROM Alunos WHERE idade > 23 OR idade < 20;

-- Seleciona alunos do sexo feminino com idade acima de 20 OU alunos de qualquer gênero com idade inferior a 20
SELECT * FROM Alunos WHERE (genero = 'F' AND idade > 20) OR idade < 20;

Operador IN

O operador IN permite especificar múltiplos valores em uma cláusula WHERE, atuando como um "OU" simplificado para uma única coluna.

Sintaxe: SELECT coluna FROM nome_da_tabela WHERE coluna IN (valor1, valor2, ...);

-- Seleciona alunos com idade de 20 ou 22 anos
SELECT * FROM Alunos WHERE idade IN (20, 22);

Operador BETWEEN

O operador BETWEEN seleciona valores dentro de um intervalo especificado, incluindo os limites. Ele pode ser usado com números, datas ou textos.

Sintaxe: SELECT coluna FROM nome_da_tabela WHERE coluna BETWEEN valor_inicial AND valor_final;

-- Seleciona alunos com idade entre 20 e 25 anos (inclusive)
SELECT * FROM Alunos WHERE idade BETWEEN 20 AND 25;

Operador LIKE e Coringas

O operador LIKE é usado em conjunto com coringas (wildcards) para buscar padrões de string em uma coluna. Os coringas são:

  • % (percentual): Representa zero, um ou múltiplos caracteres.
  • _ (underscore): Representa um único caracteree.

Sintaxe: SELECT coluna FROM nome_da_tabela WHERE coluna LIKE 'padrao';

-- Seleciona nomes que começam com 'A'
SELECT nome_completo FROM Alunos WHERE nome_completo LIKE 'A%';

-- Seleciona nomes que contêm a sequência 'Silva'
SELECT nome_completo FROM Alunos WHERE nome_completo LIKE '%Silva%';

-- Seleciona nomes que têm 'o' como o segundo caractere
SELECT nome_completo FROM Alunos WHERE nome_completo LIKE '_o%';

-- Seleciona nomes que terminam com 'a' e têm pelo menos 5 caracteres
SELECT nome_completo FROM Alunos WHERE nome_completo LIKE '____a';

Ordenação e Agregação de Dados

Cláusula ORDER BY

A cláusula ORDER BY é utilizada para classificar o conjunto de resultados de uma consulta em ordem ascendente (ASC, padrão) ou descendente (DESC) com base em uma ou mais colunas.

Sintaxe: SELECT coluna FROM nome_da_tabela ORDER BY coluna [ASC|DESC];

-- Seleciona todos os alunos, ordenados pela idade em ordem crescente
SELECT nome_completo, idade FROM Alunos ORDER BY idade ASC;

-- Seleciona todos os alunos do sexo feminino, ordenados pela idade em ordem decrescente
SELECT nome_completo, idade FROM Alunos WHERE genero = 'F' ORDER BY idade DESC;

-- Ordena por cidade (ascendente) e depois por idade (descendente)
SELECT nome_completo, cidade, idade FROM Alunos ORDER BY cidade ASC, idade DESC;

Funções de Agregação

Funções de agregação realizam um cálculo em um conjunto de linhas e retornam um único valor. São frequentemente usadas com a cláusula GROUP BY.

Função Descrição
COUNT(coluna) Conta o número de linhas (excluindo NULLs em uma coluna específica). COUNT(*) conta todas as linhas, incluindo NULLs.
SUM(coluna_numerica) Calcula a soma dos valores em uma coluna numérica.
AVG(coluna_numerica) Calcula a média dos valores em uma coluna numérica.
MIN(coluna) Retorna o menor valor em uma coluna.
MAX(coluna) Retorna o maior valor em uma coluna.
-- Conta o número total de alunos
SELECT COUNT(*) AS TotalDeAlunos FROM Alunos;

-- Calcula a média das idades dos alunos
SELECT AVG(idade) AS MediaDasIdades FROM Alunos;

-- Encontra a idade mínima e máxima entre os alunos
SELECT MIN(idade) AS IdadeMinima, MAX(idade) AS IdadeMaxima FROM Alunos;

Cláusula GROUP BY

A cláusula GROUP BY agrupa linhas que têm os mesmos valores em colunas especificadas em um conjunto de linhas de resumo, como a soma ou a média de uma coluna. É sempre usada com funções de agregação.

Regra: Todas as colunas listadas no SELECT que não são parte de uma função de agregação devem aparecer na cláusula GROUP BY.

Sintaxe: SELECT coluna_agrupadora, FUNCAO_AGREGACAO(coluna) FROM nome_da_tabela GROUP BY coluna_agrupadora;

-- Calcula a média de idade para cada gênero
SELECT genero, AVG(idade) AS MediaIdadePorGenero FROM Alunos GROUP BY genero;

-- Conta o número de alunos por cidade
SELECT cidade, COUNT(id_aluno) AS AlunosPorCidade FROM Alunos GROUP BY cidade;

Cláusula HAVING

A cláusula HAVING é usada para filtrar grupos de linhas retornados pela cláusula GROUP BY. Diferentemente de WHERE, que filtra linhas individuais antes do agrupamento, HAVING filtra os resultados após a agregação.

Sintaxe: SELECT coluna_agrupadora, FUNCAO_AGREGACAO(coluna) FROM nome_da_tabela GROUP BY coluna_agrupadora HAVING condicao_agregada;

-- Encontra cidades que têm mais de um aluno
SELECT cidade, COUNT(id_aluno) AS TotalAlunos FROM Alunos GROUP BY cidade HAVING COUNT(id_aluno) > 1;

-- Calcula a média de idade por gênero, mas apenas para gêneros cuja média de idade seja maior que 21
SELECT genero, AVG(idade) AS MediaIdade FROM Alunos GROUP BY genero HAVING AVG(idade) > 21;

Funções SQL Comuns

Funções Numéricas

O MySQL oferece diversas funções para operações matemáticas:

Função Descrição
ABS(x) Retorna o valor absoluto de x.
RAND() Retorna um número aleatório entre 0 e 1.
MOD(x, y) Retorna o resto da divisão de x por y.
POWER(x, y) Retorna x elevado à potência de y.
ROUND(x) Retorna x arredondado para o inteiro mais próximo.
ROUND(x, y) Retorna x arredondado para y casas decimais.
SQRT(x) Retorna a raiz quadrada de x.
TRUNCATE(x, y) Trunca o número x para y casas decimais.
CEIL(x) ou CEILING(x) Retorna o menor inteiro maior ou igual a x.
FLOOR(x) Retorna o maior inteiro menor ou igual a x.
GREATEST(x1, x2, ...) Retorna o maior valor de uma lista de argumentos.
LEAST(x1, x2, ...) Retorna o menor valor de uma lista de argumentos.
SELECT
   ABS(-15) AS ValorAbsoluto,
   RAND() AS NumeroAleatorio,
   MOD(17, 5) AS RestoDivisao,
   POWER(3, 2) AS TresAoQuadrado,
   ROUND(7.89) AS ArredondadoInteiro;

SELECT
   ROUND(123.45678, 2) AS ArredondadoDuasCasas,
   SQRT(16) AS RaizQuadrada,
   TRUNCATE(987.654321, 3) AS TruncadoTresCasas,
   CEIL(4.1) AS Teto,
   FLOOR(4.9) AS Chão;

Funções de String

Manipulação de texto é fundamental, e o MySQL oferece uma rica coleção de funções de string:

Função Descrição
TRIM(str) Remove espaços (ou outros caracteres) do início e/ou fim da string.
CONCAT(s1, s2, ...) Concatena duas ou mais strings.
SUBSTR(str, pos, len) ou SUBSTRING(str, pos, len) Extrai uma sub-string de str começando na posição pos, com comprimento len. Se len for omitido, extrai até o final.
LENGTH(str) Retorna o comprimento da string em bytes.
CHAR_LENGTH(str) Retorna o comprimento da string em caracteres.
REPLACE(str, from_str, to_str) Substitui todas as ocorrências de from_str em str por to_str.
UPPER(str) ou UCASE(str) Converte todos os caracteres da string para maiúsculas.
LOWER(str) ou LCASE(str) Converte todos os caracteres da string para minúsculas.
LEFT(str, len) Retorna os len caracteres mais à esquerda da string.
RIGHT(str, len) Retorna os len caracteres mais à direita da string.
REPEAT(str, count) Repete a string str um número count de vezes.
SPACE(count) Retorna uma string contendo count espaços.
STRCMP(s1, s2) Compara duas strings. Retorna 0 se iguais, -1 se s1 < s2, 1 se s1 > s2.
REVERSE(str) Inverte a string.
SELECT
   TRIM('   Olá Mundo   ') AS StringTrimada,
   CONCAT('MySQL', ' ', 'Database') AS StringConcatenada,
   SUBSTRING('ExemploDeTexto', 8, 2) AS SubStringExtraida,
   LENGTH('Dados') AS ComprimentoBytes,
   UPPER('mysql') AS Maiusculas,
   LOWER('SQL') AS Minusculas;

SELECT
   REPLACE('banana', 'a', 'o') AS StringSubstituida,
   LEFT('Desenvolvimento', 4) AS PrimeirosQuatro,
   RIGHT('Programação', 5) AS UltimosCinco,
   REVERSE('olá') AS StringInvertida;

Consultas Complexas

Apelidos (Aliases)

Apelidos temporários podem ser atribuídos a tabelas ou colunas para tornar as consultas mais legíveis ou para simplificar referências em junções complexas. Usa-se a palavra-chave AS, embora ela seja opcional.

Sintaxe: SELECT coluna AS nome_do_apelido FROM tabela AS apelido_tabela;

-- Apelido para a coluna e para a tabela
SELECT A.nome_completo AS NomeDoAluno, A.idade AS IdadeDoAluno
FROM Alunos AS A
WHERE A.cidade = 'Porto';

Junções de Tabelas (JOINs)

As cláusulas JOIN são usadas para combinar linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas.

INNER JOIN (Junção Interna)

Retorna apenas as linhas que possuem correspondência nas duas tabelas. Linhas sem correspondência em qualquer uma das tabelas são excluídas do resultado.

-- Seleciona o nome do aluno e o curso que ele está matriculado, apenas se houver correspondência em ambas as tabelas
SELECT A.nome_completo, M.nome_curso
FROM Alunos AS A
INNER JOIN Matriculas AS M ON A.id_aluno = M.id_aluno;

LEFT JOIN (Junção à Esquerda)

Retorna todas as linhas da tabela da esquerda (a primeira tabela no FROM) e as linhas correspondentes da tabela da direita. Se não houver correspondência na tabela da direita, os valores para as colunas da tabela da direita serão NULL.

-- Retorna todos os alunos e seus cursos, se houver. Alunos sem matrícula ainda aparecerão.
SELECT A.nome_completo, M.nome_curso, M.status_aprovacao
FROM Alunos AS A
LEFT JOIN Matriculas AS M ON A.id_aluno = M.id_aluno;

RIGHT JOIN (Junção à Direita)

Retorna todas as linhas da tabela da direita (a segunda tabela no FROM) e as linhas correspondentes da tabela da esquerda. Se não houver correspondência na tabela da esquerda, os valores para as colunas da tabela da esquerda serão NULL.

-- Retorna todas as matrículas e os alunos correspondentes, se houver. Matrículas sem aluno correspondente ainda aparecerão.
SELECT A.nome_completo, M.nome_curso, M.ano_matricula
FROM Alunos AS A
RIGHT JOIN Matriculas AS M ON A.id_aluno = M.id_aluno;

Subconsultas (Subqueries)

Uma subconsulta é uma consulta SQL aninhada dentro de outra consulta SQL. Ela pode ser usada em cláusulas como WHERE, FROM ou SELECT e é executada primeiro, fornecendo um resultado que a consulta externa usa.

Sintaxe: SELECT coluna FROM tabela WHERE coluna OPERADOR (SELECT coluna FROM outra_tabela WHERE condicao);

-- Encontra os nomes dos cursos nos quais alunos com 22 anos estão matriculados
SELECT nome_curso FROM Matriculas
WHERE id_aluno IN (SELECT id_aluno FROM Alunos WHERE idade = 22);

-- Seleciona alunos que têm matrícula em qualquer curso
SELECT nome_completo FROM Alunos
WHERE id_aluno IN (SELECT id_aluno FROM Matriculas);

Operador EXISTS

O operador EXISTS é usado para testar a existência de qualquer registro em uma subconsulta. Ele retorna TRUE se a subconsulta retornar uma ou mais linhas, e FALSE caso contrário. A consulta externa é executada apenas se EXISTS retornar TRUE.

Sintaxe: SELECT coluna FROM tabela_principal WHERE EXISTS (SELECT 1 FROM sub_tabela WHERE condicao_correlacionada);

-- Seleciona alunos que estão matriculados no curso 'Programação Python'
SELECT nome_completo, cidade
FROM Alunos AS A
WHERE EXISTS (SELECT 1 FROM Matriculas AS M WHERE M.id_aluno = A.id_aluno AND M.nome_curso = 'Programação Python');

-- Seleciona alunos que NÃO têm nenhuma matrícula
SELECT nome_completo
FROM Alunos AS A
WHERE NOT EXISTS (SELECT 1 FROM Matriculas AS M WHERE M.id_aluno = A.id_aluno);

Tags: MySQL SQL Consultas BancosDeDados DML

Publicado em 6-20 21:40