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 BYagrupa 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
COUNT,SUM,AVG,MINeMAX, 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:
- Filtragem inicial (WHERE): Primeiro, se houver uma cláusula
WHERE, ela filtra os registros que serão considerados para o agrupamento. - Agrupamento (GROUP BY): Os registros filtrados são então agrupados conforme os campos especificados.
- Filtragem de grupos (HAVING): Após o agrupamento, a cláusula
HAVINGpode ser usada para filtrar os grupos resultantes, geralmente com base em funções de agregação. - 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: Clientes, Encomendas 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 JOINuneClienteseEncomendaspela chave do cliente. - O segundo
INNER JOINune o resultado anterior comProdutospela chave do produto.
