SQL
Ana Carolina Salgado
Fernando Fonseca
Valéria Times
SQL
SQL - Structured Query Language
Linguagem de Consulta Estruturada
Fundamentada no modelo relacional, inclui
comandos para:
definição de dados
consulta
atualização
10/13/25 © CIn/UFPE 2
Origem: SQL
Primeira versão: SEQUEL, definida por Chamberlain
em 1974 na IBM
Em 1975 foi implementado o primeiro protótipo
Revisada e ampliada entre 1976 e 1977 e teve seu
nome alterado para SQL por razões jurídicas
Em 1982, o American National Standard Institute
tornou SQL padrão oficial de linguagem em ambiente
relacional
Utilizada tanto de forma interativa como incluída em
linguagens hospedeiras
10/13/25 © CIn/UFPE 3
SQL
Enfoques de SQL:
Linguagem interativa de consulta (ad-hoc):
usuários podem definir consultas
independente de programas.
Linguagem de programação para acesso a
banco de dados: comandos SQL embutidos
em programas de aplicação.
Linguagem de administração de dados: o DBA
pode utilizar SQL para realizar suas tarefas.
10/13/25 © CIn/UFPE 4
Enfoques de SQL (cont):
SQL
Linguagem cliente/servidor: os programas clientes
usam comandos SQL para se comunicarem e
compartilharem dados com o servidor.
Linguagem para banco de dados distribuídos:
auxilia na distribuição de dados por vários nós e
na comunicação de dados com outros sistemas.
Caminho de acesso a outros bancos de dados em
diferentes máquinas: auxilia na conversão entre
diferentes produtos em diferentes máquinas.
10/13/25 © CIn/UFPE 5
Usos de SQL
DDL
Criar (CREATE) Implementação
Destruir (DROP)
Modificar (ALTER) Ambiente
SQL
DML
Segurança Consultar (SELECT)
Controle Inserir (INSERT)
Remover (DELETE)
Administração Atualizar (UPDATE)
10/13/25 © CIn/UFPE 6
SQL
Vantagens:
Independência de fabricante
Portabilidade entre sistemas
Redução de custos com treinamento
Comandos em inglês
Consulta interativa
Múltiplas visões de dados
Manipulação dinâmica dos dados
10/13/25 © CIn/UFPE 7
SQL
Desvantagens:
A padronização inibe a criatividade
Está longe de ser uma linguagem relacional
ideal
Algumas críticas:
falta de ortogonalidade nas expressões
discordância com as linguagens hospedeiras
não dá suporte a alguns aspectos do modelo
relacional.
10/13/25 © CIn/UFPE 8
Esquema Relacional dos
Exemplos
Empregado Cad Nome Sexo Salário Num-Dep Cad-Spv
Departamento Número Nome Cad-Ger Data-Ini
Locais Num-Dep Num-Loc
Projeto Número Nome Local Num-Dep
Trabalha-em Cad-Emp Num-Proj Horas
Dependente Cad Nome Data-nasc Grau-P
10/13/25 © CIn/UFPE 9
SQL
Comandos SQL (padrão ANSI):
Criação e destruição de tabelas
Extração de dados de uma tabela
Inserção, modificação e remoção de
dados
Definição de visões
Definição de privilégios de acesso
10/13/25 © CIn/UFPE 10
SQL
Criação de Tabelas
CREATE TABLE <tabela>
(<descrição dos atributos>
<descrição das chaves>)
Descrição dos atributos: lista dos atributos
com respectivos tipos de dados: smallint,
char, money, varchar, integer, decimal,
float, real, date, time, timestamp, logical.
10/13/25 © CIn/UFPE 11
SQL
A chave primária deve ser declarada como
not null unique
ou PRIMARY KEY (<atributos>)
Descrição das chaves: lista das chaves
estrangeiras na forma:
FOREIGN KEY (<atributo>) REFERENCES
<tabela> (<atributo>)
10/13/25 © CIn/UFPE 12
Criação de tabelas:
SQL
Exemplo:
Empregado Cad Num-Dep Cad-Spv
Nome Sexo Salário
CREATE TABLE Empregado
(Cad smallint not null,
Nome char (20),
Sexo char,
Salário decimal (10,2),
Num-Dep integer,
Cad-Spv smallint,
PRMARY KEY (Cad),
FOREIGN KEY Num-Dep REFERENCES Departamento
(Número),
FOREIGN KEY Cad-Spv REFERENCES Empregado (Cad))
10/13/25 © CIn/UFPE 13
SQL
Criação de tabelas:
Exemplo:
Trabalha-em Cad-Emp Num-Proj Horas
CREATE TABLE Trabalha-em
(Cad-emp smallint not null ,
Num-Proj integer not null ,
Horas decimal (3,1)
PRIMARY KEY (Cad_emp, Num_proj)
FOREIGN KEY Cad-Emp REFERENCES Empregado
(Cad),
FOREIGN KEY Num-Proj REFERENCES Projeto
(Número))
10/13/25 © CIn/UFPE 14
SQL
Destruição de tabelas
DROP TABLE <tabela>
Elimina a tabela que foi previamente
criada.
Exemplo:
DROP TABLE Empregado
10/13/25 © CIn/UFPE 15
SQL
Extração de Dados de uma Tabela
Comando SELECT
Selecionando atributos (Projeção):
SELECT <lista de atributos> FROM
<tabela>
Exemplo: Listar nome e salário de todos
os empregados
SELECT Nome, Salário FROM Empregado
10/13/25 © CIn/UFPE 16
SQL
Selecionando todos os atributos
SELECT * FROM <tabela>
Exemplo: Listar o conteúdo de Empregado
SELECT * FROM Empregado
10/13/25 © CIn/UFPE 17
SQL
Selecionando tuplas da tabela
SELECT <lista de atributos> FROM
<tabela> WHERE <condição>
onde condição:
<nome atributo> <operador> <valor>
Operadores Relacionais: =, !=, <, <=, >, >=
Operadores Lógicos: AND, OR e NOT
10/13/25 © CIn/UFPE 18
SQL
Selecionando tuplas da tabela
Exemplos:
Listar nome e sexo dos empregados do
departamento 15.
SELECT Nome, Sexo FROM Empregado
WHERE Num-Dep = 15
Listar nome e sexo dos empregados do
departamento 15 com salário > R$ 1.000,00
SELECT Nome, Sexo FROM Empregado
WHERE Num-Dep = 15 AND Salário > 1000
10/13/25 © CIn/UFPE 19
SQL
Operadores BETWEEN e NOT BETWEEN:
substituem o uso dos operadores <= e >=
... WHERE <nome atributo> BETWEEN
<valor1> and <valor2>
Exemplo:
Listar os empregados com salário entre
R$ 1.000,00 e R$ 2.000,00
SELECT * FROM Empregado
WHERE Salário BETWEEN 1000 and 2000
10/13/25 © CIn/UFPE 20
SQL
Operadores LIKE e NOT LIKE: só se aplicam
sobre atributos do tipo char. Operam como = e !
=, utilizando os símbolos: % (substitui uma
palavra) e _ (substitui um caracter).
...WHERE <nome atributo> LIKE <valor1>
Exemplo:
Listar os empregados que tem como primeiro
nome ‘José‘
SELECT Nome FROM Empregado
WHERE Nome LIKE ‘José%’
10/13/25 © CIn/UFPE 21
SQL
Operadores IN e NOT IN: procuram dados que
estão ou não contidos em um dado conjunto de
valores.
... WHERE <nome atributo> IN <valores>
Exemplo:
-Listar o nome e data de nascimento dos
dependentes com grau de parentesco ‘M’ ou ‘P’
SELECT Nome, Data-Nasc FROM
Dependentes WHERE Grau-P IN (‘M’, ‘P’)
10/13/25 © CIn/UFPE 22
SQL
Operadores IS NULL e IS NOT NULL:
identificam valores nulos dos atributos.
... WHERE <nome atributo> IS NULL
Exemplo:
Listar os projetos que não tenham local
definido
SELECT * FROM Projeto
WHERE Local IS NULL
10/13/25 © CIn/UFPE 23
SQL
Ordenando os dados selecionados
(ORDER BY)
SELECT <lista atributos> FROM <tabela>
[WHERE <condição>] ORDER BY
<Nome atributo> {ASC |
DESC}
10/13/25 © CIn/UFPE 24
SQL
Exemplo:
Listar todos os empregados ordenados
ascendentemente por nome.
SELECT * FROM Empregado ORDER BY
Nome
Listar todos os empregados ordenados
descendentemente por salário
SELECT * FROM Empregado
ORDER BY Salário DESC
10/13/25 © CIn/UFPE 25
SQL
Realizando cálculo com informação
selecionada
Pode-se criar um campo que não pertença à
tabela a partir de cálculos sobre atributos da
tabela
Exemplo:
Mostrar o novo salário dos empregados
calculado com base no reajuste de 60%
para os que ganham abaixo de R$ 1.000,00
10/13/25 © CIn/UFPE 26
SQL
SELECT Nome, Novo-salário = (Salário *
1.60)
FROM Empregado WHERE Salário <
1000
10/13/25 © CIn/UFPE 27
SQL
Utilizando funções sobre conjuntos
Comandos: MAX, MIN, SUM, AVG, COUNT
Exemplos:
Mostrar o valor do maior salário dos
empregados
SELECT MAX (Salário) FROM Empregado
10/13/25 © CIn/UFPE 28
SQL
Mostrar qual o salário médio dos
empregados
SELECT AVG (Salário) FROM
Empregado
Quantos empregados ganham mais de
R$1.000,00?
SELECT COUNT (*) FROM Empregado
WHERE Salário > 1000
10/13/25 © CIn/UFPE 29
SQL
Cláusula DISTINCT
Elimina tuplas duplicadas do resultado de
uma consulta.
Exemplo:
Quais os diferentes salários dos
empregados?
SELECT DISTINCT Salário FROM
Empregado
10/13/25 © CIn/UFPE 30
SQL
Agrupando informações selecionadas
(GROUP BY)
Organiza a seleção de dados em grupos
Exemplo:
Listar os empregados por sexo
SELECT Nome, Sexo FROM Empregado
GROUP BY Sexo
10/13/25 © CIn/UFPE 31
SQL
Agrupando Informações de forma
condicional (HAVING)
Seleciona entre as tuplas resultantes, as
que satisfazem um dada condição.
10/13/25 © CIn/UFPE 32
SQL
Exemplo:
Listar o número total de empregados
que recebem salários superior a
R$1.000,00, agrupados por
departamento mas só daqueles com
mais de 5 empregados.
SELECT Num-Dep, COUNT (*)
FROM Empregado
WHERE Salário > 1000
GROUP BY Num-Dep
HAVING COUNT(*) > 5
10/13/25 © CIn/UFPE 33
SQL
Recuperando dados de várias tabelas
(JOIN)
Citar as tabelas envolvidas na cláusula
FROM
Qualificadores de nomes: para referenciar
o nome do empregado, [Link]
Exemplos:
Listar o nome do empregado e do
departamento onde está alocado
10/13/25 © CIn/UFPE 34
SQL
SELECT [Link],[Link]
FROM Empregado, Departamento
WHERE [Link]-Dep=
[Link];
Listar os nomes dos departamentos que têm
projetos
SELECT [Link]
FROM Departamento, Projeto
WHERE [Link]-Dep=
[Link];
10/13/25 © CIn/UFPE 35
SQL
Observações:
Podemos utilizar as cláusulas (NOT)
LIKE, (NOT) IN, IS (NOT) NULL
misturadas aos operadores AND, OR e
NOT nas equações de junção.
Podemos agrupar e/ou ordenar o
resultado de uma junção.
Agrupamento/Ordenação pode ser feito
através de mais de um atributo.
10/13/25 © CIn/UFPE 36
SQL
Exemplo: Listar os departamentos que têm
projetos com número superior a 99 e
localizados em RJ ou SP ordenados por nome
de departamento
SELECT [Link]
FROM Departamento, Projeto
WHERE [Link] IN (‘RJ’, ‘SP’)
AND Projeto.Número > 99
AND [Link]-Dep=
[Link]
ORDER BY [Link] ;
10/13/25 © CIn/UFPE 37
SQL
Outro Exemplo: Classificando uma Junção
Para cada departamento, liste o número, o
nome e o salário de seus empregados
SELECT [Link], [Link], [Link], [Link]
FROM Departamento D, Empregado E
WHERE [Link] = [Link]-Dep
ORDER BY [Link], [Link] DESC;
10/13/25 © CIn/UFPE 38
SQL
Outro Exemplo: Agrupando através de mais
de um atributo em uma Junção
Encontre o total de projetos de cada
funcionário
SELECT [Link]-Dep, [Link], COUNT(*) AS Total
FROM Trabalha-em T, Empregado E
WHERE [Link] = [Link]-Emp
GROUP BY [Link]-Dep, [Link]
ORDER BY [Link]-Dep, [Link];
10/13/25 © CIn/UFPE 39
SQL
Juntando mais de duas tabelas
Exemplo:
Listar o nome dos empregados, com
seu respectivo departamento que
trabalhem mais de 20 horas em algum
projeto
10/13/25 © CIn/UFPE 40
SQL
SELECT [Link],
[Link]
FROM Empregado, Departamento,
Trabalha-em
WHERE [Link] > 20
AND [Link]-Emp = [Link]
AND [Link]-Dep =
Departamento.Número;
10/13/25 © CIn/UFPE 41
SQL
Utilizando consultas encadeadas
O resultado de uma consulta é
utilizado por outra consulta, de forma
encadeada e no mesmo comando SQL.
O resultado do comando SELECT mais
interno (subselect) é usado por outro
SELECT mais externo para obter o
resultado final.
O SELECT mais interno (subconsulta ou
consulta aninhada) pode ser usado
apenas nas cláusulas WHERE e HAVING
do comando mais externo.
10/13/25 © CIn/UFPE 42
SQL
Utilizando consultas encadeadas(Cont.)
Existem 3 tipos de subconsultas:
ESCALAR: Retornam um único valor.
ÚNICA LINHA: Retornam várias
colunas, mas apenas uma única linha é
obtida.
TABELA: Retornam uma ou mais
colunas e múltiplas linhas.
10/13/25 © CIn/UFPE 43
SQL
Exemplo: Usando uma subconsulta com
operador de igualdade
Listar os empregados que trabalham no
departamento de Informática.
SELECT Cad, Nome, Salario
FROM Empregado
WHERE Num-Dep =
(SELECT Numero
FROM Departamento
WHERE Nome = ‘Informática’ );
10/13/25 © CIn/UFPE 44
SQL
Utilizando consultas encadeadas(Cont.)
Observações
A subconsulta anterior é do tipo
ESCALAR: Retorna o código do
departamento de Informática.
Operadores Relacionais: =, !=, <, <=, >, >=
A subconsulta deve sempre estar entre ().
10/13/25 © CIn/UFPE 45
SQL
Exemplo: Usando uma subconsulta com
função agregada
Listar os empregados cujos salários são
maiores do que o salário médio, mostrando
o quanto são maiores.
SELECT Cad, Nome, Sexo,
Salario - ( SELECT AVG (Salario)
FROM Empregado) AS DifSal
FROM Empregado
WHERE Salario > ( SELECT AVG ( Salario)
FROM Empregado );
10/13/25 © CIn/UFPE 46
SQL
Utilizando consultas encadeadas(Cont.)
Observações
A subconsulta anterior é do tipo
ESCALAR: Retorna o salário médio dos
empregados.
A condição abaixo é incorreta:
WHERE Salario > AVG ( Salario)
10/13/25 © CIn/UFPE 47
SQL
Exemplo: Subconsultas aninhadas: Uso do IN
Listar os departamentos que tenham
qualquer projeto em RJ
SELECT [Link]
FROM Departamento
WHERE Departamento.Número IN
(SELECT [Link]-Dep
FROM Projeto
WHERE [Link] = ‘RJ’) ;
10/13/25 © CIn/UFPE 48
SQL
Outro Exemplo: Uso do IN
Listar os dependentes dos funcionários que
trabalham no departamento de Informática
SELECT Nome, Data-nasc, Grau-P
FROM Dependente
WHERE Cad IN ( SELECT Cad
FROM Empregado
WHERE Num-Dep =
( SELECT Numero
FROM Departamento
WHERE Nome = ‘Informática’ ) );
10/13/25 © CIn/UFPE 49
SQL
Exemplo: Utilizando ANY / SOME
São usadas com subconsultas que produzem
uma única coluna de números.
Listar os empregados cujos salários são maiores
do que o salário de pelo menos um funcionário
do departamento 20
SELECT Cad, Nome, Sexo, Salario
FROM Empregado
WHERE Salario > SOME ( SELECT Salario
FROM Empregado
WHERE Num-Dep = 20) ;
10/13/25 © CIn/UFPE 50
SQL
Exemplo: Utilizando ALL
É utilizado com subconsultas que produzem uma
única coluna de números.
Listar os empregados cujos salários são maiores
do que salário de cada funcionário do
departamento 15
SELECT Cad, Nome, Sexo, Salario
FROM Empregado
WHERE Salario > ALL ( SELECT Salario
FROM Empregado
WHERE Num-Dep = 15) ;
10/13/25 © CIn/UFPE 51
SQL
Regras genéricas de subconsultas
A cláusula ORDER BY não pode ser usada em
uma subconsulta.
A lista de atributos especificados no SELECT de
uma subconsulta deve conter um único elemento
(exceto para EXISTS).
Nomes de atributos especificados na subconsulta
estão associados às tabelas listadas na cláusula
FROM da mesma.
É possível referir-se a uma tabela da cláusula
FROM da consulta mais externa utilizando
qualificadores de atributos.
10/13/25 © CIn/UFPE 52
SQL
Regras genéricas de subconsultas (Cont.)
Quando a subconsulta é um dos operandos
envolvidos em uma comparação, ela deve
aparecer no lado direito da comparação.
Por exemplo, seria incorreto especificar:
SELECT Cad, Nome, Sexo, Salario
FROM Empregado
WHERE
( SELECT AVG ( Salario)
FROM Empregado ) < Salario;
10/13/25 © CIn/UFPE 53
SQL
EXISTS e NOT EXISTS
Foram projetadas para uso apenas com
subconsultas.
EXISTS
Retorna TRUE existe pelo menos uma
linha produzida pela subconsulta.
Retorna FALSE a subconsulta produz
uma tabela resultante vazia.
10/13/25 © CIn/UFPE 54
SQL
Exemplo: Utilizando EXISTS
Liste todos os empregados que trabalham no
departamento de Informática.
SELECT Cad, Nome, Sexo, Salario
FROM Empregado E
WHERE EXISTS
( SELECT *
FROM Departamento D
WHERE [Link]-Dep = [Link] AND
[Link] = ‘Informática’) ;
10/13/25 © CIn/UFPE 55
SQL
Operações de Conjunto
UNION
Linhas duplicadas são removidas da tabela
resultante.
Exemplo: Construa uma lista de todos os
locais onde existe um departamento ou um
projeto.
( SELECT Local FROM Projeto
WHERE Local IS NOT NULL )
UNION
( SELECT Local FROM Locais ) ;
10/13/25 © CIn/UFPE 56
SQL
Operações de Conjunto (Cont.)
INTERSECT
Exemplo: Construa uma lista de todos os
locais onde existe ambos um departamento
e um projeto.
( SELECT Local
FROM Projeto )
INTERSECT
( SELECT Local
FROM Locais ) ;
10/13/25 © CIn/UFPE 57
SQL
Operações de Conjunto (Cont.)
EXCEPT / MINUS
Exemplo: Construa uma lista de todos os
locais onde existe um departamento mas
nenhum projeto.
( SELECT Local
FROM Locais )
EXCEPT
( SELECT Local
FROM Projeto );
10/13/25 © CIn/UFPE 58
SQL
Adicionando tupla à tabela
INSERT INTO <tabela> (<lista de
atributos>) VALUES (<valores>);
INSERT INTO Empregado(Cad, Nome,
Sexo, Salário, Num_Dep, Cad_Supv)
VALUES (015, ‘José da Silva’, ‘M’, 1000, 1,
020)
10/13/25 © CIn/UFPE 59
SQL
Adicionando tuplas usando SELECT
INSERT INTO <tabela> (<lista de
atributos>)
SELECT <lista de atributos>
FROM <tabela>
WHERE <condição>
10/13/25 © CIn/UFPE 60
SQL
INSERT INTO depto-info (nome-depto, num-
emp, total-sal)
SELECT [Link], COUNT(*), SUM ([Link])
FROM Departamento D, Empregado E
WHERE [Link] = [Link]-Dep
GROUP BY [Link]
HAVING COUNT (*) > 50 ;
10/13/25 © CIn/UFPE 61
SQL
Atualizando tuplas
UPDATE <nome tabela>
SET <nome atributo> = valor
WHERE <condição> ;
UPDATE Empregado SET Salário =
1500 WHERE Cad = 015;
10/13/25 © CIn/UFPE 62
SQL
Apagando tuplas da tabela
DELETE FROM <tabela>
WHERE <condição> ;
DELETE FROM Empregado
WHERE Salário > 5000 ;
10/13/25 © CIn/UFPE 63
SQL
Utilizando Visões (VIEWS)
São tabelas virtuais que não ocupam
espaço físico
Criação, Utilização, Inserção,
Modificação, etc.
CREATE VIEW <nome da view>
<lista de atributos> AS SELECT...
10/13/25 © CIn/UFPE 64
SQL
Criar uma visão dos empregados do
departamento 10 que tenham mais de 20
horas de trabalho em projetos
CREATE VIEW Dep-10 AS
SELECT [Link],
[Link]-Proj
FROM Empregado, Trabalha-em
WHERE [Link] > 20
AND [Link]-Emp =
[Link]
AND [Link]-Dep = 10;
10/13/25 © CIn/UFPE 65
SQL
Garantindo privilégios de acesso
GRANT <privilégios> ON <nome
tabela/view> TO <usuário> onde:
<privilégios>: SELECT, INSERT, DELETE,
UPDATE, ALL
PRIVILEGES e
<usuário>: usuário cadastrado, PUBLIC
GRANT SELECT ON Empregado TO acs;
10/13/25 © CIn/UFPE 66
SQL
REVOKE <privilégios> ON <nome
tabela/view> FROM <usuário>
REVOKE SELECT ON Projeto FROM
PUBLIC;
10/13/25 © CIn/UFPE 67
SQL
Sumário
Forma Geral de um Comando SQL:
SELECT [ DISTINCT / ALL] { * | expressão
[ AS novoNome] | listaAtributos }
FROM nomeTab1[alias1], nomeTab2[alias2],...
[ WHERE condição ]
[GROUP BY listaColunas] [HAVING condição]
[ORDER BY listaColunas]
10/13/25 © CIn/UFPE 68
SQL
Sumário (Cont.)
Cada comando SQL produz uma tabela
resultante consistindo de 1 ou mais colunas e
de 0 ou mais linhas.
Cláusula SELECT
Identifica colunas e/ou dados derivados
que aparecerão na tabela resultante.
Todos os atributos devem ter suas
tabelas/visões correspondentes, listadas na
cláusula FROM.
SELECT e FROM são as únicas cláusulas
obrigatórias.
10/13/25 © CIn/UFPE 69
SQL
Sumário (Cont.)
Cláusula WHERE: Seleciona linhas para
serem incluídas na tabela resultante.
Cláusula ORDER BY
Permite ordenar a tabela resultante com
base nos valores de 1 ou mais atributos.
Pode ser feita de forma crescente ou
decrescente.
Se especificada, deve ser a última
cláusula do comando SQL.
10/13/25 © CIn/UFPE 70
SQL
Sumário (Cont.)
Funções COUNT, SUM, AVG, MIN e MAX
Recebem uma coluna inteira como
argumento e retornam um único valor.
COUNT, MIN e MAX aplicam-se a atributos
numéricos/ não-numéricos.
É ilegal misturar estas funções com
nomes de atributos do SELECT, exceto se
a cláusula GROUP BY é usada.
Valores nulos são eliminados por cada
função (exceto no caso de COUNT(*)).
Para eliminar duplicadas, use DISTINCT.
10/13/25 © CIn/UFPE 71
SQL
Sumário (Cont.)
Cláusula GROUP BY
Permite que informação de resumo seja
incluída na tabela.
HAVING atua como uma cláusula WHERE
para grupos, restringindo-os.
Porém, HAVING pode ter funções
agregadas.
10/13/25 © CIn/UFPE 72