Escolar Documentos
Profissional Documentos
Cultura Documentos
SQL
Elaini Simoni Angelotti
elaini.angelotti@gmail.com
1
SQL (DDL)
– Define o esquema do BD (base, tabelas, integridade, etc)
– Criando BD com comandos SQL:
create database nome_do_banco_de_dados
create database Sistema_Bancário
5
SQL - Constraints
• UNIQUE
– Restrição Unique é utilizada para manter os dados inseridos
com valores únicos.
Create Table Alunos
( Matricula Int,
CPF numeric(11) Unique,
Nome varchar(70)
)
• NOT NULL
– A restrição Not Null indica que este atributo deve ter o valor
obrigatoriamente preenchido
Create Table Alunos
( Matricula Int,
CPF numeric(11) Unique,
Nome varchar(70) Not Null
)
6
• DEFAULT
– A restrição default indicar qual valor será atribuído ao registro
quando não vier valor para este atributo no Insert.
Create Table Alunos
( Matricula Int,
CPF numeric(11) Unique,
Nome varchar(70) Not Null,
Estado char(2) default ‘PR’
)
• CHECK
– A restrição Check verifica se o valor atribuído ao registro (no
Insert) é um dos valores permitidos para o atributo.
• FOREIGN KEY
– Esta restrição garante a integridade referencial.
( Matricula Int Primary Key,
CPF numeric(11) Unique,
Nome varchar(70) Not Null,
Estado char(2) default ‘PR’,
Sexo char(1) check (Sexo in (‘M’,’F’),
Codprofissao Int foreign key references Profissao (cod)
) 8
Nomenclatura de Restrições
Create Table Aluno
( Matricula Int Constraint PKAluno Primary Key,
CPF numeric(11) Constraint UnCPF Unique,
Nome varchar(70) Constraint NNNome Not Null,
Estado char(2) Constraint DFEstado default ‘PR’,
Sexo char(1) Constraint CKSexo check (Sexo in (‘M’,’F’)),
Codprofissao Int Constraint FKProfissao foreign key
references Profissao (cod)
)
9
Restrições de chaves compostas
• Exemplo 1: chave primária composta
Create Table AlunoCurso
( CodAluno int not null,
CodCurso int not null,
Constraint PkAlunoCurso Primary Key(CodAluno, CodCurso),
Constraint FkACAluno Foreign key (CodAluno) references Aluno(codAluno),
Constraint FkACCurso Foreign key (CodCurso) references Curso(codCurso)
)
n Agencia_ 1
CONTA AGENCIA
conta
n 1
Depositant agencia-
e empréstimo
n n
n devedor n
CLIENTE EMPRÉSTIMO
Modelo Relacional:
Conta (num_conta, nome_ag, saldo)
Agencia (nome_ag, cidade_ag, fundos)
Cliente (nome_cli, cidade_cli, rua_cli)
Depositante (num_conta, nome_cli)
Emprestimo (num_emp, nome_ag, total)
Devedor (nome_cli, num_emp) 11
SQL (DML)
• INSERT
– podemos especificar uma tupla a ser inserida ou escrever
uma consulta cujo resultado é um conjunto de tuplas a
inserir.
– Os valores dos atributos para as tuplas a serem inseridas
devem pertencer ao domínio desses atributos
– as tuplas a serem inseridas devem estar na ordem correta.
Produto cartesiano:
select distinct nome_cli, devedor.num_emp, nome_ag
from devedor, emprestimo
where devedor.num_emp = emprestimo.num_emp
Junção:
select distinct nome_cli, devedor.num_emp , nome_ag
from devedor INNER JOIN emprestimo ON
devedor.num_emp = emprestimo.num_emp
16
• ALIASES
– Pode-se renomear tanto atributos qto Tabelas.
– Para renomear Tabelas ou atributos utilizamos a cláusula as
que pode aparecer tanto tanto no select qto no from.
nome_antigo as nome_novo
– Exemplo:
select distinct nome_cli, devedor.num_emp, nome_ag as ‘Nome Agencia’
from devedor INNER JOIN emprestimo ON
devedor.num_emp = emprestimo.num_emp
– Exemplos:
‘Ba%’ - qualquer string que comece com ‘Ba’
‘%iba%’ - qualquer string que possua uma substring ‘iba’.
‘_ _ _’ - qualquer string com 3 caracteres
‘_ _ _%’ qualquer string com pelo menos 3 caracteres
18
– Exemplo: encontre os nomes de todos os clientes
cujas as ruas possuam a substring “aio”
select nome_cli
from cliente
where rua_cli like ‘%aio%’
27
• SUBCONSULTAS ANINHADAS
– Uma subconsulta é uma expressão select-from-where
aninhada dentro de outra consulta.
– Membros de Conjuntos
• permite verificar se um registro é membro ou não de uma Tabela.
• O conectivo in testa os membros de um conjunto, no qual o
conjunto é a coleção de valores produzidos pela cláusula select.
• O conectivo not in testa a ausência de membros de um conjunto.
– Ex: Encontre todos os clientes que possuem tanto
uma conta qto um empréstimo no banco.
select distinct nome_cli
from devedor
where nome_cli in (select nome_cli
from depositante)
28
– Ex2: Encontre todos os clientes que possuem um empréstimo, mas
não uma conta no banco.
select distinct nome_cli
from devedor
where nome_cli not in (select nome_cli
from depositante)
– Ex4: Encontre todos os clientes que tenham tanto uma conta qto um
empréstimo na agência “Batel”
select nome_cli,nome_ag
from devedor INNER JOIN emprestimo ON devedor.num_emp=emprestimo.num_emp
where nome_ag = 'Batel' and nome_cli in
(select nome_cli
from depositante INNER JOIN conta ON
depositante.num_conta = conta.num_conta)
29
• VERIFICAÇÃO DE TABELAS VAZIAS
– o construtor exists retorna true se o argumento de uma subconsulta é
não-vazio.
– Através do construtor not exists podemos testar a não existência de
tuplas na subconsulta
– Exemplo: encontre todos os clientes que tenham tanto uma conta qto
um empréstimo no banco
select nome_cli
from devedor
where exists (select nome_cli from depositante
where depositante.nome_cli = devedor.nome_cli)
• TABELAS DERIVADAS
– É possível o uso de uma expressão de subconsulta na cláusula from.
– Ex: Encontre a média dos saldos das agências em que a média dos
saldos em conta é > que 1.200
select nome_ag
from (select nome_ag, avg (saldo)
from conta
group by nome_ag)
as resultado (nome_ag, saldo_medio)
where saldo_medio > 1.200 30
• COMPARAÇÃO DE CONJUNTOS
– A frase “maior que ao menos uma” pode ser
representada em SQL pelo construtor > some.
– Ex: encontre os nomes de todas as agências que tenham
fundos maiores que ao menos uma agência localizada em
Curitiba.
select distinct nome_ag
from agencia
where fundos >some (select fundos
from agencia
where cidade_ag = ‘Curitiba’)
– A SQL permite comparações <some, <= some, >= some, =
some, <> some
– a palavra any é sinônimo de some em SQL.
– A frase “maior que todos” pode ser representada pelo
construtor > all
– A SQL permite comparações <all, <= all, >= all, = all, <> all
31
– Ex: encontre os nomes de todas as agências que
tenham fundos maiores que cada uma das agências
localizada em Curitiba.
select distinct nome_ag
from agencia
where fundos > all (select fundos
from agencia
where cidade_ag = ‘Curitiba’)
– Funções agregadas não podem ser agregadas em
SQL, por exemplo, max (avg (...))
– Ex: Encontre a agência que tem o maior saldo médio.
select distinct nome_ag
from conta
group by nome_ag
having avg (saldo) >= all (select avg (saldo)
from conta
32
group by nome_ag)
• INSERT usando uma consulta cujo resultado é
um conjunto de tuplas a inserir.
– Exemplo: Dê a todos os clientes da agencia Batel uma
caderneta de poupança de R$200, sendo que o numero do
empréstimo serve como o numero da caderneta de
poupança.
insert into conta
select num_emp, nome_ag, 200
from emprestimo
where nome_ag = ‘Batel’
– O comando select é executado primeiro resultando
em um conjunto de tuplas que são inseridas em uma
Tabela conta.
33
• UPDATE
– modifica valores de tuplas sem alterar todos os valores.
– Ex1: Dê a todos os saldos 5% como pagamento da taxa de juros
update conta
set saldo = saldo * 0.05
comando acima é aplicado uma vez para cada tupla de conta.
– Ex2: Dê às contas com saldo superior a 10.000 juros de 6% e as
demais contas juros de 5%.
update conta
set saldo = saldo * 0.06
where saldo > 10.000
update conta
set saldo = saldo * 0.05
where saldo < = 10.000
• Atualização de Visões
– O nome de uma visão pode aparecer em qualquer lugar onde o nome de
uma Tabela aparece.
create view agencia_emprestimo as
select nome_ag, num_emp
from emprestimo