Escolar Documentos
Profissional Documentos
Cultura Documentos
CIn.ufpe.br CIn.ufpe.br
3
diferentes produtos em diferentes máquinas 4
Usos de SQL
SQL - Vantagens
DDL Independência de fabricante
Criar (CREATE) Implementação Portabilidade entre sistemas
Remover (DROP)
Modificar (ALTER) Ambiente Redução de custos com treinamento
Comandos em Inglês
SQL Consulta interativa
Múltiplas visões de dados
DML
Segurança Consultar (SELECT)
Manipulação dinâmica dos dados.
Controle Inserir (INSERT)
Remover (DELETE)
Administração Atualizar (UPDATE)
CIn.ufpe.br CIn.ufpe.br
5 6
1
Esquema Relacional dos Exemplos
SQL - Desvantagens Empregado (Cad, Nome, Sexo, Salario, Num_Dep, Cad_Spv)
Num_Dep referencia Departamento (Numero),
A padronização inibe a criatividade Cad_Spv referencia Empregado(Cad)
Departamento (Numero, Nome, Cad_Ger, Data_Ini)
Está longe de ser uma linguagem relacional ideal
Cad_Ger referencia Empregado(Cad)
Algumas críticas
Locais (Num_dep, Nome_Loc)
falta de ortogonalidade nas expressões Num_Dep referencia Departamento (Numero)
discordância com as linguagens hospedeiras
Projeto (Numero, Nome, Num_Dep, Local)
não dá suporte a alguns aspectos do modelo Num_Dep referencia Departamento (Numero)
relacional
Trabalha_em (Cad_Emp, Num_Pro, Horas)
Cad_Emp referencia Empregado(Cad),
Num_Pro referencia Projeto (Numero)
Dependente (Cad_emp, Nome, Data_nasc, Grau_P)
Cad_emp referencia Empregado(Cad)
CIn.ufpe.br CIn.ufpe.br
7 8
Criação de Tabelas
Comandos SQL (Padrão ANSI)
Definição de nova tabela → CREATE TABLE
SQL CREATE TABLE <nome da tabela>
Criação, alteração e remoção de tabelas
Inserção, modificação e remoção de dados (<descrição dos atributos>
Extração de dados de uma tabela (Consultas) <descrição das chaves>
Definição de visões <descrição das restrições);
Definição de privilégios de acesso.
Descrição dos atributos → <nome> <tipo>
Tipos de dados (Oracle): varchar2, char,
nvarchar2, nchar, number, number(n),
number(m,n), binary_integer, binary_float,
binary_double, date, timestamp, blob, clob, nclob
CIn.ufpe.br CIn.ufpe.br
9 10
CIn.ufpe.br CIn.ufpe.br
11 12
2
Criação de Tabelas Criação de Tabelas
Chave primária por auto-numeração Descrição de Restrições
No Oracle (Cont.) Salário não pode ser inferior ao mínimo
Ao inserir dados na tabela, deve-se
solicitar a criação do valor ao sistema no SQL CONSTRAINT nometabela_check
atributo chave utilizando o comando CHECK (salario >= 880.00)
<nome_seq>.NEXTVAL
Lista das chaves estrangeiras na forma Cada valor do atributo é único na relação,
mesmo não sendo o atributo chave primária
SQL
CONSTRAINT nometabela_fkey SQL CONSTRAINT nometabela_const
FOREIGN KEY (<atributo>) UNIQUE (nome)
REFERENCES <outra_tabela> (<chave primária>)
CIn.ufpe.br CIn.ufpe.br
13 14
15 16
17 18
3
Criação de Tabelas Criação de Tabelas
Exemplo 3 (Considerando que a relação Projeto já foi
criada) Criação de índices em uma tabela existente →
Trabalha_em_ (Cad_Emp, Num_Proj, Horas) CREATE INDEX
Cad_Emp referencia Empregado(Cad), São estruturas que permitem agilizar a busca e
Num_Proj referencia Projeto (Numero) ordenação de dados em tabelas
SQL CREATE TABLE Trabalha_em
(Cad_Emp integer,
CREATE [UNIQUE] INDEX <nome> ON
Num_Proj integer, <tabela> (<atributo1>[, <atributo2>…]);
Horas number (3,1) ,
CONSTRAINT trabalha_em_pkey Exemplo 3: Criar um índice sobre o atributo
PRIMARY KEY (Cad_emp, Num_proj), salario de Empregado
CONSTRAINT trabalha_em_fkey1
FOREIGN KEY (Cad_Emp) REFERENCES Empregado CREATE INDEX indice_sal ON
(Cad), Empregado (salario);
CONSTRAINT trabalha_em_fkey2
FOREIGN KEY (Num_Proj )REFERENCES Projeto É usado automaScamente pelo sistema
(Numero)); CIn.ufpe.br nas consultas realizadas por salario CIn.ufpe.br
19 20
21 22
23 24
4
Extração de Dados de uma Tabela Extração de Dados de uma Tabela
(Consulta) Empregado (Consulta)
Consultar dados em uma tabela → SELECT Cad Nome Sexo Salario Num_Dep Cad_Spv
1 José M 5000.00 1 2
Selecionando atributos (Projeção)
2 Maria F 800.00 2 NULL
3 João M 3000.00 1 2
π <lista de atributos> (Nome-da-relação) Álgebra Relacional
SQL
π nome, salario (Empregado) Álgebra Relacional
SELECT <lista de atributos> FROM <tabela>; S
Q
SQL L
Exemplo 8: Listar nome e salário de todos os SELECT Nome, Salario FROM Empregado;
empregados Nome Salario
José 5000.00
Maria 800.00
CIn.ufpe.br CIn.ufpe.br
João 3000.00
25 26
Exemplo 9: Selecionar todos os atributos dos Cad Nome Sexo Salario Num_Dep Cad_Spv
empregados 1 José M 5000.00 1 2
Uma constante,
variável ou σ Num_Dep = 1 (Empregado)
consulta aninhada
Álgebra Relacional
S
Q
L
CIn.ufpe.br CIn.ufpe.br
29 30
5
Extração de Dados de uma Tabela Extração de Dados de uma Tabela
(Consulta) (Consulta)
SQL Exemplo 11: Listar nome e sexo dos empregados
SELECT * FROM Empregado WHERE Num_Dep = 1; do departamento 11 com salário > R$ 4.000,00
Empregado
Cad Nome Sexo Salario Num_Dep Cad_Spv
Cad Nome Sexo Salario Num_Dep Cad_Spv
1 José M 5000.00 1 2
1 José M 5000.00 1 2
2 Maria F 800.00 2 NULL
3 João M 3000.00 1 2
3 João M 3000.00 1 2
Álgebra Relacional
σ Num_Dep = 1 AND salario > 4000.00 (Empregado)
π nome, sexo ( )
S
Q
L
CIn.ufpe.br CIn.ufpe.br
31 32
L
WHERE <atributo> = &<variável>; CIn.ufpe.br CIn.ufpe.br
33 34
35 36
6
Operadores SQL Operadores SQL
Empregado
Cad Nome Sexo Salario Num_Dep Cad_Spv
LIKE e NOT LIKE: só se aplicam sobre atributos do
1 José M 5000.00 1 2
tipo char
2 Maria F 800.00 2 NULL
3 João M 3000.00 1 2
Operam como = e < >, respectivamente
O uso do símbolo % permite que a posição na
π nome ( )
σ salario between 4000.00 and 10000.00(Empregado) cadeia de caracteres seja substituída por
Álgebra Relacional qualquer cadeia de caracteres
SQL
O uso do símbolo _ permite que a posição na
SELECT Nome FROM Empregado cadeia de caracteres seja substituída por
WHERE Salario BETWEEN 4000 AND 10000; qualquer caractere
Nome
José
CIn.ufpe.br CIn.ufpe.br
37 38
Empregado Nome
José
Cad Nome Sexo Salario Num_Dep Cad_Spv
João
1 José M 5000.00 1 2
2 Maria F 800.00 2 NULL
3 João M 3000.00 1 2
π nome ( )
σ nome like 'Jo%' (Empregado)
S
Álgebra Relacional Q
L
CIn.ufpe.br CIn.ufpe.br
39 40
Bruno 01/02/2000
CIn.ufpe.br Gina 05/10/2002 CIn.ufpe.br
41 42
7
Operadores SQL Operadores SQL
IS NULL e IS NOT NULL: identificam se o atributo
tem valor nulo (ou não informado) SQL
SQL ... WHERE <nome atributo> IS NULL; SELECT Numero, Nome FROM Projeto
WHERE Local IS NULL;
Exemplo 16: Listar número e nome dos projetos
que não tenham local definido
Numero Nome
Projeto
3 Testes
Numero Nome Num_Dep Local
1 Desenvolvimento 1 Recife
2 Análise 1 Olinda
3 Testes 2 NULL
CIn.ufpe.br CIn.ufpe.br
45 46
CIn.ufpe.br CIn.ufpe.br
47 48
8
Ordenando os Dados Selecionados Realizando Cálculo com
Informação Selecionada
SQL Pode-se criar um campo para a resposta da consulta
SELECT * FROM Empregado ORDER BY que não pertença à tabela a partir de cálculos sobre
Salario DESC; atributos da tabela
Uso de operadores aritméticos
CIn.ufpe.br CIn.ufpe.br
49 50
51 52
π nome, salario ( )
σ max(salario) (Empregado)
S
Álgebra Relacional
Q
L
CIn.ufpe.br CIn.ufpe.br
53 54
9
Funções Agregadas Funções Agregadas
Exemplo 21: Mostrar qual o salário médio dos
A solução é buscar o nome e o salário do empregados
empregado que tem o maior salário
Empregado
Consulta aninhada Cad Nome Sexo Salario Num_Dep Cad_Spv
SQL
1 José M 5000.00 1 2
SELECT Nome, Salario FROM Empregado
média
2 Maria F 800.00 2 média
NULL
WHERE Salario IN ( SELECT MAX (Salario) 3 João M 3000.00 1 2
FROM EMPREGADO );
σ avg (salario) (Empregado)
π salario ( )
Nome Salario S
Álgebra Relacional Q
L
José 5000.00
CIn.ufpe.br CIn.ufpe.br
55 56
Empregado
AVG(Salario) Cad Nome Sexo Salario Num_Dep Cad_Spv
Contar
2933.33 1 José M 5000.00 1 2
2 Maria F 800.00 2 contar NULL
3 João M 3000.00 1 2
CIn.ufpe.br CIn.ufpe.br
57 58
59 60
10
Cláusula DISTINCT Cláusula GROUP BY
Organiza a seleção de dados em grupos
SQL
Exemplo 24: Listar os quantitativos de
SELECT DISTINCT Cad_spv empregados de cada sexo
FROM Empregado;
Empregado
Cad Nome Sexo Salario Num_Dep Cad_Spv
1 José M 5000.00 1 2
Cad_Spv
Contar
2 Maria F 800.00 2 NULL
-
Contar
3 João M 3000.00 1 2
2
Agrupar
π sexo, count(*) ( )
σ group by(sexo) (Empregado)
S
Álgebra Relacional
Q
L
CIn.ufpe.br CIn.ufpe.br
61 62
Sexo Count(*)
M 2
F 1
CIn.ufpe.br CIn.ufpe.br
63 64
Agrupar
Num_Dep Count(*)
π num_dep, count(*) ( )
σ salario > 1000.00, group by(num_dep), count(*) >1 (Empregado))
1 2
Álgebra Relacional S
Q
L
CIn.ufpe.br CIn.ufpe.br
65 66
11
Consultando Dados de Várias Tabelas
Uso de “Alias”
- Junção
Para substituir nomes de tabelas em comandos Junção de Tabelas (JOIN)
SQL Citar as tabelas envolvidas na cláusula FROM
São definidos na cláusula FROM Qualificadores de nomes - utilizados para evitar
ambiguidades
SQL
Referenciar os nomes de Empregado e de
SELECT A.nome FROM Departamento A Departamento
WHERE A.Numero = 15;
Empregado.Nome
Alias Departamento.Nome
Melhor ainda usar alias
CIn.ufpe.br CIn.ufpe.br
67 68
Junção de Tabelas
Exemplo 26: Listar o nome de cada empregado e
Junção de Tabelas
o nome do departamento no qual está alocado SQL
SELECT E.Nome, D.Nome
Empregado FROM Empregado E, Departamento D
Cad Nome Sexo Salario Num_Dep Cad_Spv
WHERE E.Num_Dep = D.Numero;
1 José M 5000.00 1 2
2 Maria F 800.00 2 NULL
3 João M 3000.00 1 2
Departamento
E.NOME D.NOME
Numero Nome Cad_Ger Data_Ini
1 RH 3 12/03/2010 José RH
2 Contabilidade 2 15/01/2009 João RH
Maria Contabilidade
69 70
Projeto
Numero Nome Num_Dep Local
Nome
1 Desenvolvimento 1 Recife
2 Análise 1 Olinda
RH
3 Testes 1 NULL
π D.nome ( Projeto))
σ (Departamento Numero = Num_Dep
Álgebra Relacional
CIn.ufpe.br CIn.ufpe.br
71 72
12
Junção de Tabelas Junção de Tabelas
Departamento
Pode-se utilizar as cláusulas (NOT) LIKE, (NOT) IN, Numero Nome Cad_Ger Data_Ini
Álgebra Relacional
π D.nome (
σ P.Numero < 3, P.Local IN ('Olinda', 'Recife') (Departamento
CIn.ufpe.br Numero = Num_Dep Projeto)) CIn.ufpe.br
73 74
Nome
RH
CIn.ufpe.br CIn.ufpe.br
75 76
77 78
13
Junção de Tabelas Junção de Tabelas
Empregado
Cad Nome Sexo Salario Num_Dep Cad_Spv
Agrupando por meio de mais de um atributo em
1 José M 5000.00 1 2
uma Junção 2 Maria F 800.00 2 NULL
3 3 15
3 2 15
3 1 14
79 Álgebra Relacional 80
81 82
Junção de Tabelas
Empregado
Cad Nome Sexo Salario Num_Dep Cad_Spv Junção de Tabelas
1 José M 5000.00 1 2
SQL
2 Maria F 800.00 2 NULL SELECT E.Nome, D.Nome
3 João M 3000.00 1 2
FROM Empregado E, Departamento D,
Trabalha_em
Cad_Emp Num_Proj Horas
Trabalha_em T
1 1 20 WHERE T.Horas > 20
1 2 24
2 2 44
Departamento
Numero Nome Cad_Ger Data_Ini
AND T.Cad_Emp = E.Cad
3 3 15 1 RH 3 12/03/2010 AND E.Num_Dep = D.Numero;
3 2 15 2 Contabilidade 2 15/01/2009
3 1 14 E.NOME D.NOME
José RH
π E.Nome , D.Nome (σ T.Horas > 20 (Trabalha_Em Cad_Emp = Cad Empregado, Maria Contabilidade
Empregado Num_Dep = Numero Departamento))
CIn.ufpe.br CIn.ufpe.br
Álgebra Relacional 83 84
14
Junção de Tabelas Junção de Tabelas
CIn.ufpe.br CIn.ufpe.br
85 86
SQL
SELECT <atributos>
FROM <tabela A> LEFT [OUTER] JOIN <tabela B>
ON <condição de junção>;
CIn.ufpe.br CIn.ufpe.br
87 88
89 90
15
Junção de Tabelas Junção de Tabelas
Outer join (Cont.)
Outer join (Cont.)
Exemplo 33: Listar os nomes dos
Para escrever uma consulta que executa uma departamentos da companhia com os nomes
outer join das tabelas A e B e retorna todas as e locais dos projetos de que são responsáveis
tuplas de B além das tuplas comuns, utilizar e os nomes dos demais projetos
SQL
SELECT <atributos>
FROM <tabela A> RIGHT [OUTER] JOIN <tabela B>
ON <condição de junção>;
CIn.ufpe.br CIn.ufpe.br
91 92
CIn.ufpe.br CIn.ufpe.br
95
96
16
Junção de Tabelas Junção de Tabelas
Departamento SQL
Numero
1
Nome
RH
Cad_Ger
3
Data_Ini
12/03/2010
SELECT D.Nome, P.Nome, P.Local
2 Contabilidade 2 15/01/2009 FROM Departamento D FULL OUTER JOIN
Projeto P
Projeto
ON D.Numero = P.Num_Dep;
Numero Nome Num_Dep Local
1 Desenvolvimento 1 Recife
2 Análise 1 Olinda
D.NOME P.NOME P.LOCAL
3 Testes 1 NULL
RH Desenvolvimento Recife
RH Análise Olinda
Álgebra Relacional
RH Testes
π D.nome, P.Nome, P.Local (
σ(Departamento Numero = Num_DepProjeto)) Contabilidade
CIn.ufpe.br CIn.ufpe.br
97 98
CIn.ufpe.br CIn.ufpe.br
99 100
17
Consultas Encadeadas (Aninhadas) Consultas Encadeadas (Aninhadas)
SQL
SELECT Cad, Nome, Salario Usando uma subconsulta com função agregada
FROM Empregado Subconsulta escalar Exemplo 36: Listar os empregados cujos
salários são maiores do que o salário médio,
WHERE Num_Dep = mostrando a diferença para o salário médio
(SELECT Numero
FROM Departamento
WHERE Nome = ‘Contabilidade' );
Departamento
Numero Nome Cad_Ger Data_Ini
1 RH 3 12/03/2010
2 Contabilidade 2 15/01/2009
18
Consultas Encadeadas (Aninhadas) Cláusulas ANY/SOME
SQL
SELECT Nome, Data_nasc, Grau_P São usadas com subconsultas que produzem
FROM Dependente WHERE Cad_Emp IN uma única coluna de números
( SELECT Cad FROM Empregado
Exemplo 38: Listar os empregados cujos
salários são maiores do que o salário de pelo
WHERE Num_Dep = menos um funcionário do departamento 1
( SELECT Numero
FROM Departamento
WHERE Nome = ' RH' ) );
π E.Cad, E.Nome, E.Sexo, E.Salario (σ ∃salario > E.salario where E.Num_Dep = 1 (Empregado E)) CAD NOME SEXO SALARIO
Álgebra Relacional 1 José M 5000.00
CIn.ufpe.br CIn.ufpe.br
111 112
π E.Cad, E.Nome, E.Sexo, E.Salario (σ E.Salario < ∀ E.salario where E.Num_Dep = 1 (Empregado E))
Álgebra Relacional
CIn.ufpe.br CIn.ufpe.br
113 114
19
Cláusula ALL Cláusulas EXISTS e NOT EXISTS
SQL Foram projetadas para uso apenas com
SELECT Cad, Nome, Sexo, Salario subconsultas
FROM Empregado EXISTS
WHERE Salario < ALL ( SELECT Salario Retorna TRUE ⇔ existe pelo menos uma linha
FROM Empregado produzida pela subconsulta
WHERE Num_Dep = 1) ; Retorna FALSE ⇔ a subconsulta produz uma
tabela resultante vazia
Deve ser uSlizado quando for necessário
cerSficar-se que haverá resposta a uma
CAD NOME SEXO SALARIO subconsulta
2 Maria F 800.00 Exemplo 40: Liste todos os empregados
que trabalham no departamento de RH
CIn.ufpe.br CIn.ufpe.br
115 116
π E.Cad, E.Nome, E.Sexo, E.Salario (∃σ D.Nome = 'RH' (Empregado )) CAD NOME SEXO SALARIO
Álgebra Relacional 1 José M 5000.00
3 João M 3000.00
CIn.ufpe.br CIn.ufpe.br
117 118
CIn.ufpe.br CIn.ufpe.br
119 120
20
Operações de Conjunto Operações de Conjunto
Projeto
UNION
Numero Nome Num_Dep Local
Linhas duplicadas são removidas da tabela 1 Desenvolvimento 1 Recife
resultante 2 Análise 1 Olinda
Exemplo 41: Construa uma lista de todos os 3 Testes 1 NULL
locais onde existe um departamento ou um
Locais
projeto Num_Dep Nome_Loc
1 Camaragibe
1 Jaboatão
2 Olinda
π Projeto.Local U π Locais.Nome_Loc
Álgebra Relacional
CIn.ufpe.br CIn.ufpe.br
121 122
Local
Recife
Olinda
Camaragibe
Jaboatão
CIn.ufpe.br CIn.ufpe.br
123 124
1 Desenvolvimento 1 Recife
INTERSECT
2 Análise 1 Olinda ( SELECT Nome_Loc FROM Locais ) ;
3 Testes 1 NULL
Locais
Num_Dep Nome_Loc Local
1 Camaragibe
1 Jaboatão Olinda
2 Olinda
π Projeto.Local ∩ π Locais.Nome_Loc
Álgebra Relacional
CIn.ufpe.br CIn.ufpe.br
125 126
21
Operações de Conjunto Operações de Conjunto
Locais
Num_Dep Nome_Loc
MINUS 1 Camaragibe
2 Olinda
locais onde existe um departamento mas
nenhum projeto Projeto
Numero Nome Num_Dep Local
1 Desenvolvimento 1 Recife
2 Análise 1 Olinda
3 Testes 1 NULL
Π Locais.Nome_Loc - π Projeto.Local
Álgebra Relacional
CIn.ufpe.br CIn.ufpe.br
127 128
4 Clara F 7000.00 1 2
CIn.ufpe.br CIn.ufpe.br
131 132
22
Inserção de Dados em Tabelas Inserção de Dados em Tabelas
Inserir dados recuperados de uma tabela em Empregado
Cad Nome Sexo Salario Num_Dep Cad_Spv
outra tabela – uso do SELECT
1 José M 5000.00 1 2
2 Maria F 800.00 2 NULL
SQL INSERT INTO <tabela> (<lista de atributos>) 3 João M 3000.00 1 >1 2
SELECT <lista de atributos> FROM <tabela> 4 Clara F 7000.00 1 2
As duas <lista de atributos> devem ser união compawveis ... ... 1 RH 3 12/03/2010
... .... 2 Contabilidade 2 15/01/2009
Exemplo 45: Armazenar na tabela Depto_Info
(Nome_Depto, Num_Emp, Total_Sal) para cada
departamento com mais de 1 empregado, o nome
do departamento, o número de empregados e a INSERIR σ (D.Nome, Count(*) > 1, SUM(Salario), Departamento Numero = Num_Dep
soma dos salários pagos Empregado) (Depto_Info )
CIn.ufpe.br CIn.ufpe.br
133 134
4 Clara F 7000.00 1 2
CIn.ufpe.br CIn.ufpe.br
137 138
23
Remoção de Tuplas de Tabela Remoção de Tuplas de Tabela
Empregado
Exclusão de dados de uma tabela → DELETE Cad Nome Sexo Salario Num_Dep Cad_Spv
1 José M 5000.00 1 2
SQL 2 Maria F 9500.00 2 NULL
3 João M 3000.00 1 2
DELETE FROM <tabela> WHERE <condição>;
4 Clara F 7000.00 1 2
4 Clara F 7000.00 1 2
Exemplo 48: Criar uma visão dos empregados
do departamento 1 que tenham mais de 20
horas de trabalho em algum projeto
O empregado João
foi removido
CIn.ufpe.br CIn.ufpe.br
141 142
Empregado
Uklizando Visões (VIEWS) Uklizando Visões (VIEWS)
Cad Nome Sexo Salario Num_Dep Cad_Spv
1 José M 5000.00 1 2
2 Maria F 9500.00 2 NULL
4 Clara F 7000.00 1 2
SQL CREATE VIEW Dep_1 AS
SELECT E.Nome, T.Num_Proj
Trabalha_em
Cad_Emp Num_Proj Horas FROM Empregado E, Trabalha_em T
1
1
1
2
20
24
WHERE T.Horas > 20
2 2 44 AND T.Cad_Emp = E.Cad
4 1 34
AND E.Num_Dep = 1;
24
Uklizando Visões (VIEWS) Garankndo Privilégios de Acesso
Para testar, consultar a VIEW Comando GRANT
Dep_1 Onde
Nome Num_Proj
<privilégios>: SELECT, INSERT, DELETE,
José 2
Clara 1
UPDATE, ALL PRIVILEGES e
<usuário>: usuário cadastrado, PUBLIC
CIn.ufpe.br CIn.ufpe.br
145 146
25