[PIQUETE] DQL — Data Query Language
DQL — Data Query Language
SELECT, JOINs, Agregações, GROUP BY e muito mais
O que é DQL?
Tabelas de Referência
Todos os exemplos deste post usam o banco escola com as tabelas abaixo:
cursos
| id | nome | carga_h |
|---|---|---|
| 1 | Informática | 1600 |
| 2 | Administração | 1200 |
| 3 | Logística | 1400 |
alunos
| id | nome | id_curso | nota | ativo |
|---|---|---|---|---|
| 1 | Ana Silva | 1 | 8.50 | 1 |
| 2 | Carlos Mendes | 1 | 7.00 | 1 |
| 3 | Beatriz Souza | 2 | 9.20 | 1 |
| 4 | Diego Lima | 3 | 5.50 | 0 |
| 5 | Fernanda Costa | 1 | 6.80 | 1 |
| 6 | Lucas Prado | 2 | 4.50 | 0 |
| 7 | Marina Alves | 3 | 8.00 | 1 |
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 * FROM alunos;
Selecionar colunas específicas e usar alias (apelido)
SELECT nome AS 'Aluno', nota AS 'Nota Final', ativo AS 'Matriculado?' FROM alunos;
| Aluno | Nota Final | Matriculado? |
|---|---|---|
| Ana Silva | 8.50 | 1 |
| Carlos Mendes | 7.00 | 1 |
| ... | ... | ... |
WHERE — filtrando resultados
A cláusula WHERE aplica condições para filtrar as linhas retornadas.
-- 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
| Operador | Significado | Exemplo |
|---|---|---|
| = | Igual | nota = 10 |
| <> ou != | Diferente | ativo <> 0 |
| > / < / >= / <= | Comparação | nota >= 7 |
| BETWEEN a AND b | Intervalo inclusivo | nota BETWEEN 5 AND 8 |
| LIKE 'padrão' | Busca por padrão (% = qualquer coisa) | nome LIKE 'A%' |
| IN (v1, v2...) | Está na lista | id_curso IN (1,3) |
| IS NULL / IS NOT NULL | Valor nulo | email IS NULL |
| AND / OR / NOT | Lógica booleana | nota > 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.
-- 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;
| nome | nota |
|---|---|
| Beatriz Souza | 9.20 |
| Ana Silva | 8.50 |
| Marina Alves | 8.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.
-- 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;
| Média Geral | Maior Nota | Menor Nota |
|---|---|---|
| 7.07 | 9.20 | 4.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).
-- 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;
| id_curso | Qtd Alunos | Média | Melhor Nota |
|---|---|---|---|
| 1 | 3 | 7.43 | 8.50 |
| 2 | 2 | 6.85 | 9.20 |
| 3 | 2 | 6.75 | 8.00 |
HAVING — filtrando grupos
SELECT id_curso, AVG(nota) AS 'Média' FROM alunos GROUP BY id_curso HAVING AVG(nota) > 7.0;
| id_curso | Média |
|---|---|
| 1 | 7.43 |
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).
INNER JOIN
Retorna apenas as linhas que têm correspondência nas duas tabelas.
LEFT JOIN
Retorna todos os registros da esquerda e os correspondentes da direita (NULL se não houver).
RIGHT JOIN
Retorna todos os registros da direita e os correspondentes da esquerda (NULL se não houver).
INNER JOIN — alunos com seus cursos
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;
| Aluno | Curso | Nota |
|---|---|---|
| Beatriz Souza | Administração | 9.20 |
| Ana Silva | Informática | 8.50 |
| Marina Alves | Logística | 8.00 |
| Carlos Mendes | Informática | 7.00 |
| Fernanda Costa | Informática | 6.80 |
| Diego Lima | Logística | 5.50 |
| Lucas Prado | Administração | 4.50 |
LEFT JOIN — todos os cursos, mesmo sem alunos
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)
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;
| Curso | Total Alunos | Média |
|---|---|---|
| Informática | 3 | 7.43 |
| Administração | 2 | 6.85 |
| Logística | 2 | 6.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
SELECT nome, nota FROM alunos WHERE nota > ( SELECT AVG(nota) FROM alunos );
| nome | nota |
|---|---|
| Ana Silva | 8.50 |
| Beatriz Souza | 9.20 |
| Marina Alves | 8.00 |
Subquery no FROM — tabela derivada
-- 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 é:
Resumo das Cláusulas
| Cláusula | Finalidade | Obrigatória? |
|---|---|---|
| SELECT | Define as colunas do resultado | Sim |
| FROM | Especifica a(s) tabela(s) de origem | Sim |
| JOIN ... ON | Combina tabelas por coluna em comum | Não |
| WHERE | Filtra linhas antes da agregação | Não |
| GROUP BY | Agrupa linhas para funções de agregação | Não |
| HAVING | Filtra grupos após a agregação | Não |
| ORDER BY | Ordena o resultado (ASC/DESC) | Não |
| LIMIT | Limita o número de linhas retornadas | Não |
Comentários
Postar um comentário
Ficou com alguma dúvida? Quer compartilhar sua experiência? Tem uma sugestão de
melhoria? Seu comentário é muito importante!