Banco de dados em SQL: consultas com exemplos resolvidos
Aprenda SQL com um pequeno banco acadêmico: crie tabelas, insira dados e confira filtros, junções, contagens e médias com resultados explicados.

Em poucas palavras
- SQL é uma linguagem para definir, consultar e modificar dados; PostgreSQL é um dos gerenciadores que a executam.
- Uma consulta precisa declarar o significado de suas linhas, os filtros, a combinação de tabelas e a ordem do resultado.
- Os exemplos distinguem registros existentes, notas ausentes e estudantes sem avaliações para evitar contagens incorretas.
Neste artigo
Para trabalhar com um banco de dados em SQL, você usa comandos que definem tabelas, registram informações e consultam resultados. SQL é a linguagem; o sistema gerenciador executa as instruções e mantém os dados. Neste tutorial, um pequeno cenário acadêmico permite acompanhar cada consulta e conferir a saída esperada.
Os comandos usam um subconjunto simples de SQL compatível com PostgreSQL. Execute o exercício em um banco de estudo vazio. Os nomes e notas são fictícios e servem apenas para demonstrar a lógica. A proposta é entender como a pergunta se transforma em uma consulta verificável, sem depender de decorar comandos isolados.
Crie duas tabelas com funções claras
Uma tabela representa estudantes. A outra registra avaliações associadas a eles. Cada linha de estudante corresponde a uma pessoa do cenário; cada linha de avaliacao corresponde a um registro de avaliação. A separação permite que um estudante possua mais de uma avaliação e que outro ainda não possua nenhuma.
O identificador distingue cada registro, e estudante_id informa a qual estudante a avaliação pertence. A coluna nota admite NULL para representar uma nota ainda não registrada no exemplo. O significado dessa ausência foi definido para o exercício; em outro sistema, você precisaria estabelecer uma regra própria.
Para aprofundar a relação entre chaves e tabelas, consulte banco de dados relacionais. A linguagem permite executar instruções sobre estruturas existentes, mas não decide sozinha qual organização representa corretamente o problema de uma aplicação.
Insira dados que incluam situações diferentes
A documentação de inserção do PostgreSQL apresenta o comando INSERT. Informar os nomes das colunas deixa explícita a correspondência com os valores. No exercício, incluiremos duas avaliações para Ana, duas para Bruno e nenhuma para Caio; uma das avaliações de Bruno ficará sem nota.
Esses casos foram escolhidos para revelar diferenças que passariam despercebidas em uma base contendo apenas linhas completas. Uma nota nula e a inexistência de avaliação não são a mesma situação. As duas precisam continuar distinguíveis quando as tabelas forem combinadas.

SELECT e WHERE: escolha colunas e filtre linhas
A consulta de tabelas no tutorial PostgreSQL utiliza SELECT para definir o resultado e WHERE para selecionar as linhas que atendem a uma condição. Para encontrar avaliações com nota a partir de sete, compare o valor da coluna e solicite explicitamente a ordenação desejada.
| id | nota |
|---|---|
| 1 | 8.00 |
| 3 | 9.00 |
- id
- 1
- nota
- 8.00
- id
- 3
- nota
- 9.00
A avaliação 2 foi excluída porque sua nota é seis. A avaliação 4 não satisfaz o filtro porque sua nota é desconhecida. Para procurá-la, use SELECT id FROM avaliacao WHERE nota IS NULL ORDER BY id;. O resultado contém somente id = 4.
A documentação de comparações explica por que nota = NULL não substitui IS NULL. Uma comparação comum com valor nulo produz resultado desconhecido. Também não suponha que a ordem observada sem ORDER BY permanecerá igual entre execuções.
JOIN: relacione linhas por uma condição
A documentação de junções mostra como combinar tabelas. No exemplo, a ligação correta compara estudante.id com avaliacao.estudante_id. Escrever apenas as duas tabelas sem uma condição apropriada pode produzir combinações que não correspondem aos relacionamentos registrados.
| id | nome | nota |
|---|---|---|
| 1 | Ana | 8.00 |
| 2 | Ana | 6.00 |
| 3 | Bruno | 9.00 |
| 4 | Bruno | NULL |
- id
- 1
- nome
- Ana
- nota
- 8.00
- id
- 2
- nome
- Ana
- nota
- 6.00
- id
- 3
- nome
- Bruno
- nota
- 9.00
- id
- 4
- nome
- Bruno
- nota
- NULL
Ana e Bruno aparecem duas vezes porque cada um possui duas avaliações. A repetição dos nomes corresponde à unidade do resultado: uma linha por avaliação. Caio não aparece porque a junção interna conserva apenas correspondências. Aplicar DISTINCT sem pensar no significado poderia esconder informações que deveriam permanecer.
Conte avaliações e calcule médias por estudante
Para incluir Caio, comece com estudante e use LEFT JOIN. Depois agrupe por estudante. A seção de funções agregadas do PostgreSQL apresenta cálculos sobre conjuntos de linhas. Neste exercício, a escolha da coluna contada distingue registros de avaliação e notas efetivamente preenchidas.
| Estudante | Avaliações | Notas lançadas | Média |
|---|---|---|---|
| Ana | 2 | 2 | 7.00 |
| Bruno | 2 | 1 | 9.00 |
| Caio | 0 | 0 | NULL |
- Estudante
- Ana
- Avaliações
- 2
- Notas lançadas
- 2
- Média
- 7.00
- Estudante
- Bruno
- Avaliações
- 2
- Notas lançadas
- 1
- Média
- 9.00
- Estudante
- Caio
- Avaliações
- 0
- Notas lançadas
- 0
- Média
- NULL
A média de Ana é (8 + 6) ÷ 2 = 7. A de Bruno considera somente a nota preenchida, resultando em 9. Sua segunda avaliação continua existindo, mas não entra como zero. Caio não possui avaliações, e sua média permanece nula. O formato de casas decimais mostrado pelo cliente pode variar.
COUNT(*) após o LEFT JOIN contaria uma linha para Caio, porque a junção preserva o estudante mesmo sem correspondência. COUNT(a.id) resulta em zero nesse caso. Essa diferença mostra por que a pergunta sobre o significado de cada linha vem antes da escolha de uma função.
Como continuar praticando com resultados previsíveis
Altere uma pergunta por vez: quais estudantes têm notas pendentes, quem ainda não possui avaliações e qual é a quantidade de notas lançadas? Escreva primeiro o resultado esperado a partir das tabelas pequenas e só depois execute a consulta. Se a saída divergir, examine filtros, condição de junção e unidade de agregação.
O pensamento computacional ajuda a decompor essas etapas. Ao crescer o banco, você também precisará estudar integridade, permissões e desempenho. A base permanece a mesma: declarar uma pergunta precisa e conferir se a consulta produz as linhas e os valores que realmente respondem a ela.
Referências
- PostgreSQL — Inserting Data https://www.postgresql.org/docs/current/dml-insert.html
- PostgreSQL — Querying a Table https://www.postgresql.org/docs/current/tutorial-select.html
- PostgreSQL — Comparison Functions and Operators https://www.postgresql.org/docs/current/functions-comparison.html
- PostgreSQL — Joins Between Tables https://www.postgresql.org/docs/current/tutorial-join.html
- PostgreSQL — Aggregate Functions https://www.postgresql.org/docs/current/tutorial-agg.html
Autoria
Study Mais
Continue estudando

Modelo físico de banco de dados: do projeto ao SQL
Entenda como o modelo físico define tabelas, tipos, restrições e índices em um SGBD, com exemplo SQL e critérios para revisar a implementação.

Algoritmo de Euclides: MDC e divisões passo a passo
Calcule o MDC com o algoritmo de Euclides, acompanhe divisões sucessivas e entenda a prova, os casos com zero e a aplicação em frações e Bézout.

Pensamento computacional: pilares e exemplo aplicado
Entenda pensamento computacional com uma escala de monitoria: decomposição, padrões, abstração, algoritmos, testes e limites das decisões automatizadas.
