A instrução SELECT

A instrução SELECT é o principal comando do SQL para consultar e recuperar dados armazenados em tabelas de uma base de dados relacional. Ela permite selecionar linhas e colunas específicas, aplicar filtros, ordenar, agrupar resultados e realizar operações de agregação e junção entre tabelas

Sintaxe

SELECT [DISTINCT] lista_de_colunas
FROM nome_da_tabela
[WHERE condição]
[GROUP BY colunas]
[HAVING condição]
[ORDER BY colunas [ASC|DESC]];
  • SELECT: Indica as colunas que serão retornadas. O asterisco (*) pode ser usado para retornar todas as colunas.
  • FROM: Especifica a tabela (ou tabelas) de onde os dados serão extraídos.
  • WHERE: (Opcional) Filtra as linhas de acordo com uma condição, retornando apenas as que satisfazem o critério.
  • GROUP BY: (Opcional) Agrupa linhas que possuem valores iguais em uma ou mais colunas, geralmente usado com funções de agregação (SUM, COUNT, AVG, etc.).
  • HAVING: (Opcional) Filtra grupos criados pelo GROUP BY, normalmente com base em funções de agregação.
  • ORDER BY: (Opcional) Ordena o resultado de acordo com uma ou mais colunas, podendo ser crescente (ASC) ou decrescente (DESC).

Exemplos

Selecionar todas as colunas de uma tabela

SELECT * FROM Clientes;

O exemplo acima seleciona todos registos da tabela ‘clientes’ com todas as colunas.

Selecionar colunas específicas

SELECT nome, morada FROM Clientes;

O exemplo acima seleciona todos os registos da tabela ‘clientes’, com as colunas ‘nome’ e ‘morada’.

Filtrar registos de uma tabela

SELECT nome, morada, idade FROM Clientes
WHERE idade < 65;

O exemplo acima seleciona os registos da tabela ‘clientes’ em que o campo ‘idade’ seja menor que 65. Cada registo selecionado apresenta as colunas ‘nome’, ‘morada’ e ‘idade’.

Pesquisa com ordenação de colunas

SELECT nome, morada, idade FROM Clientes
WHERE idade < 65
ORDER BY nome;

O exemplo acima seleciona os registos da tabela ‘clientes’ em que o campo ‘idade’ seja menor que 65. Os registos aparecem ordenados pelo campo ‘nome’ de forma ascendente.

SELECT nr_encomenda, nr_cliente, data_encomenda, valor 
FROM ENCOMENDAS
ORDER BY VALOR DESC;

O exemplo acima seleciona todos os registos da tabela ‘encomendas’ mostrando os registos ordenados de forma descendente pelo campo ‘valor’.

Aliases

Aliases na instrução SELECT são nomes temporários atribuídos a colunas ou tabelas durante a execução de uma consulta. Eles servem principalmente para melhorar a legibilidade, simplificar consultas complexas e tornar os resultados mais compreensíveis, sem alterar os nomes originais na base de dados.

  • Um alias é criado usando a palavra-chave AS, mas o seu uso é opcional; basta colocar o nome do alias após o nome da coluna ou tabela.
  • O alias só existe durante a execução da consulta; ele não altera os nomes reais das tabelas ou colunas na base de dados.

Principais usos dos aliases

  • Renomear colunas ou resultados de expressões: útil quando os nomes originais são pouco descritivos ou quando se utilizam funções e cálculos.
  • Simplificar referências a tabelas: especialmente em joins e subconsultas, reduzindo a repetição de nomes longos.
  • Evitar ambiguidade: quando diferentes tabelas possuem colunas com o mesmo nome.

Sintaxe para colunas

SELECT nome_coluna [AS] alias_coluna
FROM nome_tabela;

Exemplo prático:

SELECT nome_produto AS Produto, preco_produto AS Preço
FROM Produtos;

Neste exemplo, o resultado exibirá as colunas com os nomes “Produto” e “Preço” ao invés dos nomes originais.

Sintaxe para tabelas

SELECT coluna1, coluna2
FROM nome_tabela AS alias_tabela;

Exemplo prático:

SELECT p.nome_produto
FROM Produtos AS p

Agrupamento de registos

O agrupamento de registos em SQL é realizado principalmente através da cláusula GROUP BY na instrução SELECT. Esse recurso permite que os dados sejam organizados em grupos com base em uma ou mais colunas, possibilitando a aplicação de funções de agregação sobre cada grupo.

O agrupamento é útil para gerar relatórios e sumarizações, como, por exemplo, saber quantos pedidos cada cliente fez ou qual o maior valor de pedido por cliente.

Funcionamento do agrupamento:

  • A cláusula GROUP BY agrupa as linhas do resultado de acordo com os valores de uma ou mais colunas especificadas.
  • Para cada grupo criado, é possível aplicar funções de agregação como COUNTSUMAVGMIN e MAX, que calculam, respectivamente, a quantidade de registros, soma, média, valor mínimo e valor máximo dentro de cada grupo.

Exemplo prático:

SELECT CODCLIENTE, COUNT(*)
FROM ENCOMENDAS
GROUP BY CODCLIENTE;

Neste exemplo, a consulta retorna o número de encomendas (COUNT(*)) feitas por cada cliente (CODCLIENTE). Cada linha do resultado representa um cliente e a quantidade de pedidos associados a ele.

Fluxo de execução com agrupamento:

  1. Filtragem inicial (WHERE): Primeiro, se houver uma cláusula WHERE, ela filtra os registros que serão considerados para o agrupamento.
  2. Agrupamento (GROUP BY): Os registros filtrados são então agrupados conforme os campos especificados.
  3. Filtragem de grupos (HAVING): Após o agrupamento, a cláusula HAVING pode ser usada para filtrar os grupos resultantes, geralmente com base em funções de agregação.
  4. Seleção e exibição: Por fim, o resultado é exibido conforme os campos e agregações especificados no SELECT.

Exemplo prático com Having:

SELECT CODCLIENTE, COUNT(*) AS TotalEncomendas
FROM ENCOMENDAS
GROUP BY CODCLIENTE
HAVING TotalEncomendas >= 2;

Neste exemplo, apenas os clientes com dois ou mais encomendas serão exibidos, pois o HAVING filtra os grupos após o agrupamento

Pesquisas em múltiplas tabelas

Em bases de dados relacionais, é comum precisar buscar informações que estão distribuídas em várias tabelas. O SQL standard permite unir três, quatro ou mais tabelas em uma única consulta usando cláusulas JOIN.

A cláusula JOIN

A cláusula JOIN em SQL serve para combinar linhas de duas ou mais tabelas com base na condição de relacionamento entre elas, geralmente usando chaves primárias e estrangeiras. Isso permite consultar e analisar dados distribuídos em várias tabelas relacionais de forma integrada, retornando um conjunto de resultados unificado.

O padrão ANSI SQL define os seguintes tipos principais de JOIN:

  • INNER JOIN: Retorna apenas as linhas em que há correspondência entre as tabelas envolvidas.
  • LEFT (OUTER) JOIN: Retorna todas as linhas da tabela à esquerda e as correspondentes da tabela à direita. Se não houver correspondência, os campos da tabela à direita vêm como NULL.
  • RIGHT (OUTER) JOIN: Retorna todas as linhas da tabela à direita e as correspondentes da tabela à esquerda. Se não houver correspondência, os campos da tabela à esquerda vêm como NULL.

Sintaxe do JOIN:

SELECT <colunas>
FROM tabela1
JOIN tabela2
  ON tabela1.campo_relacionado = tabela2.campo_relacionado
[JOIN tabela3
  ON tabela2.campo_relacionado2 = tabela3.campo_relacionado2
...]

Podemos incluir quantas cláusulas JOIN forem necessárias para unir múltiplas tabelas, sempre especificando as condições de relacionamento usando a palavra-reservada ON.

Usamos a palavra reservada ON, para especificamos o relacionamento entre a chave primária de uma tabela e a chave estrangeira da outra tabela, com ela relacionada.

Exemplo:

Suponha que temos três tabelas: ClientesEncomendas e Produtos. Para obter informações do cliente, da encomenda e do produto numa única consulta, podemos fazer:

SELECT
  Clientes.nome,
  Encomendas.numero_pedido,
  Produtos.nome_produto
FROM Clientes
INNER JOIN Encomendas
  ON Clientes.id_cliente = Encomendas.id_cliente
INNER JOIN Produtos
  ON Pedidos.id_produto = Produtos.id_produto;

No exemplo acima:

  • O primeiro INNER JOIN une Clientes e Encomendas pela chave do cliente.
  • O segundo INNER JOIN une o resultado anterior com Produtos pela chave do produto.