[PIQUETE] DQL — Data Query Language

DQL - Linguagem de Consulta de Dados | Caderno de TI

DQL — Data Query Language

SELECT, JOINs, Agregações, GROUP BY e muito mais

Banco de Dados MySQL SQL Técnico em Informática

O que é DQL?

DQL (Data Query Language) é o subconjunto da SQL dedicado a consultar e recuperar dados armazenados no banco. Seu único comando é o SELECT, mas com ele é possível filtrar, ordenar, agrupar, combinar tabelas e realizar cálculos — tornando-o o comando mais poderoso e utilizado de todo o SQL.

Tabelas de Referência

Todos os exemplos deste post usam o banco escola com as tabelas abaixo:

cursos

idnomecarga_h
1Informática1600
2Administração1200
3Logística1400

alunos

idnomeid_cursonotaativo
1Ana Silva18.501
2Carlos Mendes17.001
3Beatriz Souza29.201
4Diego Lima35.500
5Fernanda Costa16.801
6Lucas Prado24.500
7Marina Alves38.001

SELECT — Consulta Básica

O SELECT define quais colunas retornar. O FROM indica de qual tabela os dados virão. Use * para selecionar todas as colunas.

Selecionar todas as colunas

SELECT *
SELECT *
FROM   alunos;

Selecionar colunas específicas e usar alias (apelido)

Colunas + AS
SELECT nome             AS 'Aluno',
       nota             AS 'Nota Final',
       ativo            AS 'Matriculado?'
FROM   alunos;
Resultado (parcial)
AlunoNota FinalMatriculado?
Ana Silva8.501
Carlos Mendes7.001
.........

WHERE — filtrando resultados

A cláusula WHERE aplica condições para filtrar as linhas retornadas.

Filtros com WHERE
-- Alunos ativos com nota acima de 7
SELECT nome, nota
FROM   alunos
WHERE  ativo = 1
  AND  nota  > 7.0;

-- Alunos cujo nome começa com 'A'
SELECT nome
FROM   alunos
WHERE  nome LIKE 'A%';

-- Alunos de cursos 1 ou 2
SELECT nome, id_curso
FROM   alunos
WHERE  id_curso IN (1, 2);

-- Alunos com nota entre 6 e 8
SELECT nome, nota
FROM   alunos
WHERE  nota BETWEEN 6.0 AND 8.0;

 Operadores mais usados no WHERE

OperadorSignificadoExemplo
=Igualnota = 10
<> ou !=Diferenteativo <> 0
> / < / >= / <=Comparaçãonota >= 7
BETWEEN a AND bIntervalo inclusivonota BETWEEN 5 AND 8
LIKE 'padrão'Busca por padrão (% = qualquer coisa)nome LIKE 'A%'
IN (v1, v2...)Está na listaid_curso IN (1,3)
IS NULL / IS NOT NULLValor nuloemail IS NULL
AND / OR / NOTLógica booleananota > 7 AND ativo = 1

ORDER BY & LIMIT

ORDER BY ordena os resultados por uma ou mais colunas. LIMIT restringe o número de linhas retornadas.

ORDER BY e LIMIT
-- Alunos ordenados por nota (maior para menor)
SELECT nome, nota
FROM   alunos
ORDER BY nota DESC;

-- Os 3 alunos com maior nota
SELECT nome, nota
FROM   alunos
ORDER BY nota DESC
LIMIT  3;

-- Ordenar por curso (ASC) e dentro do curso por nota (DESC)
SELECT nome, id_curso, nota
FROM   alunos
ORDER BY id_curso ASC, nota DESC;
Resultado — Top 3 notas
nomenota
Beatriz Souza9.20
Ana Silva8.50
Marina Alves8.00

Funções de Agregação

Funções de agregação calculam um único valor a partir de um conjunto de linhas. São sempre usadas no SELECT ou no HAVING.

COUNT()
Conta registros
SUM()
Soma valores
AVG()
Média aritmética
MIN()
Menor valor
MAX()
Maior valor
Funções de agregação em prática
-- Total de alunos cadastrados
SELECT COUNT(*) AS 'Total de Alunos'
FROM   alunos;
-- Resultado: 7

-- Média, maior e menor nota entre todos os alunos
SELECT
  AVG(nota) AS 'Média Geral',
  MAX(nota) AS 'Maior Nota',
  MIN(nota) AS 'Menor Nota'
FROM   alunos;

-- Soma da carga horária de todos os cursos
SELECT SUM(carga_h) AS 'Total de Horas'
FROM   cursos;
Resultado — Média, Max, Min
Média GeralMaior NotaMenor Nota
7.079.204.50

GROUP BY & HAVING

GROUP BY agrupa linhas com valores iguais em uma coluna, permitindo aplicar funções de agregação por grupo. HAVING filtra esses grupos (equivalente ao WHERE, mas aplicado após a agregação).

GROUP BY — média por curso
-- Média de notas e total de alunos por curso
SELECT
  id_curso,
  COUNT(*)   AS 'Qtd Alunos',
  AVG(nota)  AS 'Média',
  MAX(nota)  AS 'Melhor Nota'
FROM   alunos
GROUP BY id_curso;
Resultado
id_cursoQtd AlunosMédiaMelhor Nota
137.438.50
226.859.20
326.758.00

HAVING — filtrando grupos

HAVING — cursos com média acima de 7
SELECT
  id_curso,
  AVG(nota) AS 'Média'
FROM   alunos
GROUP BY id_curso
HAVING   AVG(nota) > 7.0;
Resultado
id_cursoMédia
17.43
WHERE vs HAVING: o WHERE filtra linhas antes do agrupamento. O HAVING filtra grupos após a agregação. Não é possível usar funções de agregação no WHERE.

JOINs — Combinando Tabelas

JOIN combina linhas de duas ou mais tabelas com base em uma coluna em comum (geralmente PK ↔ FK).

A
B

INNER JOIN

Retorna apenas as linhas que têm correspondência nas duas tabelas.

A
B

LEFT JOIN

Retorna todos os registros da esquerda e os correspondentes da direita (NULL se não houver).

A
B

RIGHT JOIN

Retorna todos os registros da direita e os correspondentes da esquerda (NULL se não houver).

INNER JOIN — alunos com seus cursos

INNER JOIN
SELECT
  a.nome      AS 'Aluno',
  c.nome      AS 'Curso',
  a.nota      AS 'Nota'
FROM       alunos  a
INNER JOIN cursos  c  ON a.id_curso = c.id
ORDER BY   a.nota DESC;
Resultado
AlunoCursoNota
Beatriz SouzaAdministração9.20
Ana SilvaInformática8.50
Marina AlvesLogística8.00
Carlos MendesInformática7.00
Fernanda CostaInformática6.80
Diego LimaLogística5.50
Lucas PradoAdministração4.50

LEFT JOIN — todos os cursos, mesmo sem alunos

LEFT JOIN
SELECT
  c.nome         AS 'Curso',
  a.nome         AS 'Aluno',
  a.nota         AS 'Nota'
FROM      cursos  c
LEFT JOIN alunos  a  ON a.id_curso = c.id;

JOIN + GROUP BY — média por curso (com nome)

JOIN + GROUP BY
SELECT
  c.nome       AS 'Curso',
  COUNT(a.id) AS 'Total Alunos',
  AVG(a.nota) AS 'Média'
FROM       cursos  c
INNER JOIN alunos  a  ON a.id_curso = c.id
GROUP BY   c.nome
ORDER BY   'Média' DESC;
Resultado
CursoTotal AlunosMédia
Informática37.43
Administração26.85
Logística26.75

Subconsultas (Subqueries)

Uma subconsulta é um SELECT dentro de outro SELECT. Ela é executada primeiro e seu resultado é usado pela consulta externa.

Subquery no WHERE — alunos acima da média geral

Subquery no WHERE
SELECT nome, nota
FROM   alunos
WHERE  nota > (
    SELECT AVG(nota)
    FROM   alunos
);
Resultado (média geral = 7.07)
nomenota
Ana Silva8.50
Beatriz Souza9.20
Marina Alves8.00

Subquery no FROM — tabela derivada

Subquery como tabela (derived table)
-- Alunos aprovados (nota >= 7) por curso
SELECT sub.id_curso, COUNT(*) AS 'Aprovados'
FROM (
    SELECT id_curso, nota
    FROM   alunos
    WHERE  nota >= 7.0
) AS sub
GROUP BY sub.id_curso;

Ordem de Execução do SELECT

O MySQL não processa as cláusulas na ordem em que as escrevemos. A ordem real de execução é:

1
FROM
Identifica e carrega as tabelas (e realiza os JOINs)
2
WHERE
Filtra as linhas antes do agrupamento
3
GROUP BY
Agrupa as linhas filtradas
4
HAVING
Filtra os grupos após a agregação
5
SELECT
Seleciona as colunas e aplica aliases
6
ORDER BY
Ordena o resultado final
7
LIMIT
Restringe o número de linhas retornadas

Resumo das Cláusulas

CláusulaFinalidadeObrigatória?
SELECTDefine as colunas do resultadoSim
FROMEspecifica a(s) tabela(s) de origemSim
JOIN ... ONCombina tabelas por coluna em comumNão
WHEREFiltra linhas antes da agregaçãoNão
GROUP BYAgrupa linhas para funções de agregaçãoNão
HAVINGFiltra grupos após a agregaçãoNão
ORDER BYOrdena o resultado (ASC/DESC)Não
LIMITLimita o número de linhas retornadasNão

Comentários

Postagens mais visitadas deste blog

Introdução aos Sistemas de Gerenciamento de Banco de Dados

Introdução ao HTML, CSS e JavaScript - Guia para Iniciantes

Introdução ao Excel