Escolar Documentos
Profissional Documentos
Cultura Documentos
Florianópolis
Nota
Estas notas explicativas, denominadas de material de apoio, têm por objetivo auxiliar
e fomentar a discussão teórica em sala, no que diz respeito ao conteúdo proposto. Para
tanto, este documento reúne uma coleção de pensamentos de seu autor, bem como faz
uso dos exercícios propostos pelo Professor Guilherme E. Vieira de seu material de ensino
(Material de apoio - Banco de Dados e SQL - 2023 [Prof Vieira]), ficando, portanto,
resguardado e conferido crédito de autoria ao professor que, gentilmente, disponibilizou seu
material de ensino.
1. INTRODUÇÃO À LINGUAGEM SQL
2.2 Tabelas
As tabelas são estruturas fundamentais em um banco de dados. Elas representam
entidades do mundo real, como clientes, produtos ou pedidos. Cada tabela é composta por
colunas (atributos) e registros (linhas) que contêm os dados.
3. EXPLORANDO O PGADMIN
Informações Gerais
Master Password: admin
User: postgres
Password: liict
Databases (Bancos de Dados): Expandindo a pasta "Databases," você verá uma lista de
bancos de dados disponíveis. Clique com o botão direito para criar, backup ou restaurar
bancos de dados.
Schemas: Os schemas são espaços de nomes para objetos de banco de dados. Você pode
criar schemas e organizar objetos dentro deles.
Login/Group Roles: Aqui você gerencia os usuários e grupos de usuários com diferentes
níveis de acesso ao servidor e aos bancos de dados.
Com o banco criado, para importar o arquivo que contém o script com os dados, você
deverá abrir uma ferramenta de consulta. Para tanto, siga as instruções:
- Clique com o botão direito no banco de dados e escolha "Query Tool" para abrir uma janela
de consulta SQL.
- Na barra de ferramentas, click em “open file” (ícone da pastinha). Em seguida, será aberta
uma janela para que você selecione o arquivo da sua máquila local.
- Em seguida selecione todo o bloco de código (pode usar o atalho Crtl + a). Por fim, clique
em "Execute" para executá-la. Os resultados serão exibidos no painel de mensagens.
SELECT: O comando SELECT é o principal comando DQL e é usado para recuperar dados
de tabelas de um banco de dados. Ele permite projetar colunas específicas ou todas as
colunas de uma tabela. Aqui está um exemplo simples:
SELECT sobrenome, userid, cargo
FROM empregado
WHERE: A cláusula WHERE é usada para filtrar os resultados da consulta com base em
uma condição. Por exemplo:
SELECT nome
FROM empregado
WHERE id_depto = ‘41’
Pergunta-se:
Por que na cláusula WHERE, a especificação do departamento é feita entre aspas?
Observações:
1. Em cláusulas de seleção, usa-se convencionalmente aspas simples e em cláusulas de
projeção usa aspas duplas.
2. Quando usamos o * como parâmetro para o SELECT, na verdade queremos que a
consulta (query) retorne todos os atributos (colunas) da entidade (tabela) consultada.
Experimente rodar a query acima substituindo o atributo “nome” por * e repare na saída dos
dados.
SELECT id_produto
FROM item
WHERE preco > 100 AND quantidade < 500
Pergunta-se:
Quantos produtos atenderam às condições definidas na query?
LIMIT: A cláusula LIMIT é usada para limitar o número de resultados retornados por uma
consulta. Por exemplo:
SELECT *
FROM pedido
ORDER BY total DESC
LIMIT 1
Esta consulta retorna as informações do pedido que gerou o maior faturamento da empresa.
SELECT DISTINC: O comando SELECT DISTINCT é usado para retornar apenas valores
únicos em uma projeção. No exemplo abaixo, usamos esse comando para listar todos os
produtos vendidos pela empresa até o momento.
Comentários de Uma Única Linha: Para adicionar um comentário de uma única linha em
uma consulta SQL no pgAdmin, você pode usar o símbolo --, seguido do texto do
comentário. Qualquer texto após -- na mesma linha será considerado um comentário e não
afetará a execução da consulta. Exemplo:
/*
Este é um comentário
de múltiplas linhas
*/
SELECT nome
FROM cliente
SQL_03: Suponha que a empresa esteja cogitando dar um aumento para seus
funcionários. A fim de verificar como ficariam os novos valores, construa uma query para
projetar um aumento de 10% no salário de todos os funcionários do departamento 41.
Usando Títulos de Colunas: Você pode usar títulos de colunas para atribuir um nome
temporário a uma coluna em uma consulta. Isso não altera o nome real da coluna na tabela,
mas apenas como ela é exibida nos resultados da consulta.
Usando Apelidos (Aliases) para Tabelas: É possível ainda dar apelidos para as tabelas.
Isso se torna útil quando trabalhamos com projeções em múltiplas tabelas, nas quais se
encontram atributos com o mesmo nome. Para facilitar a identificação, chamamos cada
atributo em particular pelo apelido da tabela correspondente. Repare no exemplo abaixo:
SELECT DISTINCT E.nome AS "Nome do Empregado", C.nome AS "Nome do Cliente"
FROM empregado E, cliente C
Observação:
O uso da cláusula AS não é obrigatória, porém, recomendável.
Equijoins (Natural joins): É o tipo mais comum de join. Ele combina registros de duas
tabelas com base em valores correspondentes em uma coluna específica. Isso cria um
novo conjunto de resultados que inclui colunas de ambas as tabelas. FOCAREMOS NESTE
TIPO DE JOIN.
Outer joins: Os outer joins, ou joins externos, permitem combinar registros de duas tabelas,
preservando os registros não correspondentes de uma ou ambas as tabelas.
Fonte: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-joins/
Self Join: Um self join ocorre quando você combina uma tabela consigo mesma. Isso é útil
quando você deseja relacionar registros dentro da mesma tabela. Um exemplo comum é
uma tabela de funcionários em que cada registro tem um campo "supervisor_id" que se
refere ao ID do supervisor.
Uso de Literais: Os literais são valores de texto que você insere diretamente em uma
consulta SQL. Eles podem ser cadeias de caracteres entre aspas simples ou duplas,
números ou datas. O uso de literais é comum quando você deseja incluir valores fixos em
suas consultas. Veja os exemplos abaixo:
SELECT 42 AS “resposta”
SELECT nome || ' ' || sobrenome || ' é ' || cargo || ' e recebe US$ ' || salario
FROM empregado
SELECT E.nome || ' trabalha no depto de ' || D.nome || ' na ' || R.nome
FROM empregado E, depto D, região R
WHERE E.id_depto = D.id AND D.id_regiao = R.id
SELECT E.nome || ' ' || E.sobrenome || ' tem como gerente ' || G.nome
FROM empregado E, empregado G
WHERE E.id_gerente = G.id
ORDER BY G.nome
LET’S PRACTICE!
SQL_04: Crie uma query para exibir o sobrenome, salário e o percentual de comissão para
todos os representantes de vendas da tabela de empregados. Use o título “Representantes
de Vendas”.
SQL_05: Crie uma query para exibir os nomes do departamento e da região em que estão
localizados todos os departamentos da Summit Sporting Goods.
SQL_06: Crie uma query para exibir o nome e sobrenome de todos os representantes de
vendas e seus clientes. Mostre a resposta como: “<nome do cliente> é um cliente do(a)
<primeiro nome do empregado> <sobrenome do empregado>.” e nomeie a coluna como
“Representantes de vendas e seus clientes”.
SQL_07: Crie uma query para exibir o nome e sobrenome dos gerentes de armazém da
tabela armazém. Mostrar resultados como: "<Nome e Sobrenome> é o gerente do armazém
<número de armazém>" e mudar o nome da coluna para "Gerentes e seus armazéns". Use
‘aliases’ (apelidos).
LIKE: O operador LIKE é usado para fazer correspondência parcial em consultas de texto.
Pergunta-se:
Como seria possível chegar no mesmo resultado sem o uso do BETWEEN?
LET’S PRACTICE!
SQL_08: Escreva uma consulta SQL e mostre a tabela resultante para listar o sobrenome,
nome, id do departamento e salário de todos os gestores de armazém dos departamentos
42 a 44, cujo salário é superior a US$ 1600.
SQL_09: Escreva uma consulta SQL e mostre a tabela resultante para listar o sobrenome,
nome e id do departamento de todos os funcionários dos departamentos 31 e 41.
SQL_10: Escreva uma consulta SQL e mostre a tabela resultante para listar o nome, id do
departamento e salario de todos os funcionários que ganham mais que US$ 2000 que não
estejam nos departamentos 31 ou 41.
SQL_11: Escreva uma consulta SQL e mostre a tabela resultante para listar o sobrenome,
nome, id do departamento e cargo dos funcionários que estão no departamento 41 que são
estoquistas ou gerente de armazém.
SQL_12: Escreva uma consulta SQL e mostre a tabela resultante para listar o nome e
sobrenome dos funcionários cujo nome termina em “e” e que tenha exatamente seis letras.
SQL_13: Faça uma consulta SQL e mostre a tabela resultante para listar o nome,
sobrenome, ID e cargo dos funcionários cujos sobrenomes são Brown, Burns, Washington
e Jackson. Liste-os em ordem alfabética pelo nome e sobrenome.
SQL_14: Faça uma consulta SQL e mostre a tabela resultante para listar o nome do cliente
e nome e sobrenome do representante de vendas, cujo sobrenome comece com a letra H.
Pergunta-se:
O que retorna a query acima?
ABS (num): A função ABS retorna o valor absoluto de um número, ou seja, o valor sem
sinal negativo. Exemplo:
SELECT ABS(-5)
MOD (num1, num2): A função MOD retorna o resto da divisão entre dois números.
Exemplo:
SELECT MOD(10, 3)
SELECT ROUND(3.14159, 2)
Observação:
É possível passar um valor negativo para o segundo parâmetro da função ROUND. Repare
nos exemplos abaixo:
SELECT ROUND(6.1,-1)
No exemplo acima, a query arredonda o 6 para dezena mais próxima. No caso, o 6 está
mais próximo do 10 do que do zero, por isso o resultado é 10.
SELECT ROUND(6.1,-2)
Neste outro exemplo, a query arredonda o 6 para centena mais próxima. No caso, o 6 está
mais próximo do 0 do que do 100, por isso o resultado é 0.
TRUNC (num, casas_decimais): A função TRUNC é usada para truncar um número para
um número específico de casas decimais (remove as casas decimais).
SELECT TRUNC(3.14159, 2)
Repare que esta query retorna 3.14 (truncado para 2 casas decimais).
POWER (base, exp): A função POWER calcula a potência de um número elevado a uma
potência específica.
SELECT POWER(2, 3)
Nesting de Funções: É possível ainda aninhar funções, ou seja, usar o resultado de uma
função como argumento de outra. Veja o exemplo do aninhamento de ABS e ROUND:
SELECT ROUND(ABS(-5.678), 1)
Exemplos:
LPAD (st1, n, st2): Preenche uma string (st1) com caracteres (st2) à esquerda até atingir
um comprimento específico (n).
RPAD (st1, n, st2): Preenche uma string (st1) com caracteres (st2) à direita até atingir um
comprimento específico (n).
REPLACE (st, st_de_busca, st_de_substituição): Substitui todas as ocorrências de uma
substring por outra.
SUBSTRING (st, m, n): Extrai uma parte de uma string (st) com base em uma posição inicial
(m) e um comprimento (n).
Exemplos:
LTRIM, RTRIM:
Exemplos:
TO_CHAR (m, formato): Converte um valor (m) em uma string de acordo com um formato
específico.
TO_NUMBER (st, formato): Converte uma string em um valor numérico, seguindo um
formato desejado.
TO_DATE (st, formato): Converte uma string em uma data de acordo com um formato
específico.
Exemplos:
Observação:
O formato 'L9,999.999' é usado para R$.
Para fixar bem o conhecimento, suponha que você deseja construir uma query para
consultar o tempo de empresa (em dias) de cada funcionário no BD Sporting Goods. Uma
solução possível seria:
Pergunta-se:
E se quiséssemos saber a informação acima em anos, meses e dias? Como faríamos?
Essas funções e técnicas são fundamentais para manipular dados em consultas SQL
de maneira eficaz e personalizada. Ao compreender como essas funções funcionam e
quando usá-las, você poderá criar consultas SQL mais poderosas e adaptadas às suas
necessidades específicas.
LET’S PRACTICE!
SQL_15: Qual cliente tem o maior nome? Ordene resultados pelo nome, em ordem
decrescente.
SQL_16: Escreva uma consulta SQL que contenha três colunas: a primeira, com
sobrenome “justificado” à direita (use LPAD com tamanho final de 20 caracteres), a
segunda, com a inicial do primeiro nome e a terceira, com o salário, escrito da seguinte
forma: ‘***** $9,999.99’ – com tamanho total de 15 caracteres) – para estoquistas.
SQL_17: Escreva um consulta SQL para mostrar os cargos de vice presidentes. Substitua
toda instância de VP por ‘Vice Presidente’. Nomeie a coluna “CARGOS DE VICE
PRESIDENTE”.
SQL_18: Escreva uma consulta SQL que irá projetar o ID, nome e sobrenome dos
empregados cujo IDs “sejam” ímpares.
SQL_19: Elabore uma query para mostrar todos os pedidos feitos (*), caso pedido tenha
sido feito entre 31/08 e 07/09 de 2021.
SQL_20: Mostrar o id do pedido, o id do cliente e valor final total líquido (que entrará para
a empresa) dos pedidos feitos entre 31/08 e 07/09 de 2021 cujo valor total original seja
maior que $7.000,00. Sabe-se que a empresa dará um desconto de $500 e pagará imposto
de 5% sobre o total após o desconto para pedidos cujo valor total original seja maior que
$7.000,00. O valor mostrado deve ser arredondado para 2 casas decimais.
COUNT: A função COUNT é usada para contar o número de registros em uma consulta.
Pergunta-se:
Qual a diferença entre esses Count's?
Pergunta-se:
O que vocês acham que aconteceriam se o parâmetro passado para as funções MAX e
MIN fossem textuais? Experimentem executar o código abaixo:
GROUP BY: A cláusula GROUP BY é usada para agrupar resultados com base em valores
em uma ou mais colunas.
No exemplo acima, temos a média salarial por gerência, quanto empregos por
gerência e qual é o total da folha de pagamento por gerência.
HAVING: A cláusula HAVING é usada para filtrar grupos resultantes de uma consulta com
base em uma condição. Por exemplo:
LET’S PRACTICE!
SQL_21: Escreva um consulta SQL que mostre a média dos salários dos estoquistas, com
duas casas decimais e com cifrão ($).
SQL_23: Qual é o valor médio ($), o total ($) e a quantidade de pedidos por região dos
clientes? E descubra também qual região tem comprado mais de da empresa?
7. SUBCONSULTAS (SUBQUERIES)
Uma subconsulta é uma consulta aninhada dentro de outra consulta. Ela pode ser
usada em várias partes de uma consulta principal para realizar tarefas complexas. Por
exemplo, você pode usar uma subconsulta para encontrar o nome e o salário do empregado
que tem o menor salário da empresa:
Neste último exemplo, a query buscou o nome do produto que teve o maior preço
pago, dentre todos os pedidos.
LET’S PRACTICE!
SQL_24: Final de ano, o gerente quer escolher o funcionário do ano... diga a ele quem
vendeu ($) mais até hoje na empresa.
SQL_25: Mostre o nome dos vendedores que estão abaixo dos 25% da média de vendas
dos vendedores ?