1 banco de dados sql elaini simoni angelotti [email protected]

37
1 Banco de Dados Banco de Dados SQL SQL Elaini Simoni Angelotti Elaini Simoni Angelotti [email protected] [email protected]

Upload: internet

Post on 17-Apr-2015

150 views

Category:

Documents


28 download

TRANSCRIPT

Page 1: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

1

Banco de DadosBanco de DadosSQLSQL

Banco de DadosBanco de DadosSQLSQL

Elaini Simoni AngelottiElaini Simoni [email protected]@gmail.com

Page 2: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

2

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

– Por default o SQLServer seta os seguintes parâmetros:• Caminho: C:\Arquivos de programas\Microsoft SqlServer\MSSQL\data• Tamanho: 1 MB• Log: 1 MB• Crescimento do banco e do Log: 10% e sem limite

– O usuário pode “setar” os parâmetros usando comandos SQL:Create database Exemplo1

ON (Name = Exemplo1_data, Filename = ‘C:\Arquivos de programas\Microsoft SQL Server\MSSQL\data\Exemplo1.mdf’, Size = 2 MB, MaxSize = 10 MB,

Filegrowth = 25% )

Page 3: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

3

LOG

ON (Name = Exemplo1_log,

Filename = ‘C:\Arquivos de programas\Microsoft SqlServer\MSSQL\data\Exemplo1.ldf’ Size = 2 MB,

MaxSize = 6 MB,

Filegrowth = 10% )

• Alterando BD com comandos SQL:– Para expandir o BD:

Alter database Sistema_Bancário

modify file

(Name = Sistema_Bancário,

Size = 3MB)

– Para reduzir o BD:DBCC SHRINKDATABASE

(Sistema_Bancário, 5)

• Excluindo BD com comandos SQL:

Drop database Sistema_Bancário

Page 4: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

4

• Criando Tabelas com comandos SQL:

Create Table nomeTabela

( Atributo1 Tipo_de_Dados [opções], . . .

)

– Exemplo:USE Sistema_Bancário // é necessário se posicionar no BD antes

// de criar as tabelas

Create Table Cliente

( RG_Cli int not null, Nome_Cli varchar (50), Data_Cadastro datetime not null default (getdate()), Cidade_Cli varchar (12), UF char (2) default (‘PR’))

• Excluindo Tabela com comandos SQL:DROP table nome_da_tabela

DROP table Cliente

Page 5: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

5

• Alterando a Estrutura de uma Tabela com comandos SQL:– Adicionando um novo atributo

Alter table Cliente

ADD Celular_Cli varchar (8) null

– Alterando o tipo de um atributoAlter table Cliente

Alter column Cidade_Cli varchar (25)

– Excluindo um atributo de uma tabelaAlter Table Cliente

Drop Column Celular_cli

Page 6: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

6

• 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)

SQL - Constraints

Page 7: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

7

• 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.

Create Table Alunos( Matricula Int, CPF numeric(11) Unique, Nome varchar(70) Not Null, Estado char(2) default ‘PR’, Sexo char(1) check (Sexo in (‘M’,’F’)))

Page 8: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

8

• PRIMARY KEY– Restrição Utilizada para definir a chave primaria.

Create table Aluno( 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’))

• 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))

Page 9: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

9

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)

)

Page 10: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

10

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)

)

• Exemplo 2: chave estrangeira composta

Create Table Curso( CodCurso int Constraint pkCurso Primary Key,

Nome varchar (70) Not Null, CodCurriculo int not null, AnoCurriculo int not null, Constraint fkCurriculo foreign Key (CodCurriculo, AnoCurriculo) References

Curriculo (CodCurriculo, AnoCurriculo)

)

Page 11: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

11

CONTA AGENCIA

CLIENTE EMPRÉSTIMO

Depositante

agencia-empréstimo

Agencia_conta

devedor

n

n

n nn

n

1

1

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)

Exercício: Crie o BD abaixo e as respectivas tabelas (com chaves primárias, estrangeiras e as restrições (Constraint) necessárias)

Page 12: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

12

• 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.

– Exemplo: inserir a informação de que a conta “A-998” da agência Batel tem um saldo de 1.200

insert into conta

values (‘A-998’, ‘Batel’, 1.200)

insert into conta (nome_agencia, numero_conta, saldo)

values (‘Batel’, ‘A-998’, 1.200)

SQL (DML)

Page 13: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

13

• SELECT– A estrutura básica de uma expressão em SQL consiste em

três claúsulas: • select: corresponde à operação de projeção (). É usada para

relacionar os atributos desejados no resultado de uma consulta.• from: corresponde a operação do produto cartesiano ( x ). Associa

as Tabelas que serão pesquisadas durante a evolução de uma expressão.

• where: corresponde à operação de seleção (). Consiste em um predicado (condição) envolvendo atributos da Tabela que aparece no from.

– Uma consulta típica em SQL:select A1, A2, ..., Anfrom r1, r2, ..., rm

where P

onde A = atributo, r = Tabela e P = condição

– O SQL forma um produto cartesiano das Tabelas de from, executa uma seleção usando o predicado de where e projeta os resultados sobre os atributos da cláusula select.

Page 14: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

14

– O resultado de uma consulta em SQL é uma Tabela.

– Exemplo: Encontre os nomes de todas as agências da Tabela empréstimo.

select nome_agfrom emprestimo

– SQL permite duplicidade nas Tabelas, pois a eliminação da duplicidade consome muito tempo.

– Para forçar a eliminação de duplicidade usa-se o comando

distinct. Exemplo: select distinct nome_ag

from emprestimo– O asterisco “*” pode ser usado para denotar “todos os atributos”.

select emprestimo.* from emprestimo

select * from emprestimo– Select pode conter expressões aritmética (+, -, * e /). Exemplo:

select nome_ag, total * 100from emprestimo

Page 15: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

15

• WHERE– Encontre todos os números de empréstimos feitos na agencia

Batel com totais emprestados acima de R$1.200. select num_emp,total

from emprestimowhere nome_ag = ‘Batel’ and total > 1.200

– O SQL usa os conectores AND, OR e NOT, além do operadores de comparação <, <=, >, >=, = e <> na cláusula where.

– O operador de comparação between pode ser usado para simplificar a cláusula where que especifica em valor que seja maior que ou igual a algum valor e menor que ou igual a algum outro valor.

– Exemplo: Encontre os números de empréstimos e totais cujos os montantes sejam entre R$9.000 e R$100.000

select num_emp, totalfrom emprestimowhere total between 9000 and 100000

– Not between também é permitido.

Page 16: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

16

• FROM– Define a(s) tabelas que serão utilizadas na consulta. – Para duas ou mais tabelas, pode-se fazer o produto cartesiano ou a

junção das tabelas.– Ex: para todos os clientes que tenham um empréstimo em um banco,

encontre seus nomes, números de empréstimos e nome da agência

Produto cartesiano:select distinct nome_cli, devedor.num_emp, nome_agfrom devedor, emprestimowhere devedor.num_emp = emprestimo.num_emp

Junção:select distinct nome_cli, devedor.num_emp , nome_agfrom devedor INNER JOIN emprestimo ON

devedor.num_emp = emprestimo.num_emp

– usa-se a notação nome_tabela.nome_atributo para evitar ambigüidades

Page 17: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

17

• 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

– Encontre os nomes de todas as agências que tenham fundos maiores que ao menos uma agência daquelas localizadas em Curitiba

select distinct T.nome_ag

from agencia as T, agencia as S

where T.fundos > S.fundos and S.cidade_ag = ‘Ctba’

Page 18: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

18

• OPERAÇÕES COM STRINGS– As mais usadas são as verificações de coincidências de

pares, usando o operador like.• Porcentagem (%): compara qquer substring

• sublinhado ( _ ): compara qquer caracter.

– maiúsculas não são iguais a minúsculas.

– 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

Page 19: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

19

– Exemplo: encontre os nomes de todos os clientes cujas as ruas possuam a substring “aio”

select nome_clifrom clientewhere rua_cli like ‘%aio%’

– O SQL permite o uso de um caracter de escape para comparar caracteres especiais.

• like “ab\%cd%” escape “\” corresponde a todas as strings que começam com “ab%cd”

• like “ab\\cd%” escape “\” corresponde a todas as strings que começam com “ab\cd”

– é possível pesquisar diferenças em strings pelo operador de comparação not like

Page 20: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

20

• ORDER BY– A cláusula order by faz com que as tuplas do resultado de

uma consulta apareçam em uma determinada ordem.– Exemplo: listar em ordem alfabética todos os clientes que

tenham um empréstimo na agência Batel. select distinct nome_cli, devedor.num_emp from devedor INNER JOIN emprestimo ON

devedor.num_emp = emprestimo.num_emp

where nome_ag = ‘Batel’ order by nome_cli

– Order by relaciona os itens em ordem ascendente. Para especificar a ordem deve-se usar:

• Desc - para ordem descendente (maior para o menor)• Asc - para ordem ascendente (menor para o maior)

– a ordenação pode ser realizada por diversos atributos. Ex:select *from emprestimoorder by total desc, num_emp asc

Page 21: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

21

• UNION– as Tabelas participantes da operação de União

precisam ser compatíveis, ou seja, precisam ter o mesmo número de atributos.

– Encontre todos os clientes que tenham um empréstimo, uma conta ou ambos no banco.

(select nome_clifrom depositante)union(select nome_clifrom devedor)

– elimina repetições automaticamente.

– Para obter todas as repetições devemos escrever union all no lugar de union

Page 22: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

22

• FUNÇÕES AGREGADAS– São funções que tomam uma coleção de valores como

entrada e retorna um valor simples– A SQL oferece 5 funções agregadas:

• média (average): avg• mínimo (minimum): min• máximo (maximum): max• Total (total): sum• contagem (count): count

– A entrada para sum e avg precisa ser um conjunto de números

– mim, max e count podem operar com conjuntos de tipos de dados não-numéricos.

– Exemplo: Encontre a média dos saldos em contas na agência “batel”.

select avg (saldo) as mediafrom contawhere nome_ag = ‘batel’

Page 23: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

23

– A cláusula GROUP BY é usada qdo queremos aplicar uma função agregada a um grupo de registros.

– O(s) atributo(s) fornecidos em uma cláusula group by são usados para formar grupos.

– Registros com os mesmos valores de todos os atributos da cláusula group by são colocadas em um grupo.

– Exemplo: encontre a média dos saldos nas contas de cada uma das agências do banco.

select nome_ag, avg (saldo) from contagroup by nome_ag

– Quando tratamos a Tabela como um todo isto é, como um grupo simples, não é necessário utilizar a cláusula group by.

– Exemplo: Encontre a média dos saldos de todas as contas.select avg (saldo)from conta

Page 24: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

24

– Se desejarmos eliminar repetições utilizaremos a palavra distinct na expressão agregada.

– Ex: Encontre o número de depositantes de cada agênciaselect nome_ag, count (distinct nome_cli)from depositante INNER JOIN conta ON

depositante.num_conta = conta.num_conta

group by nome_ag

– Pode-se definir condições e aplicá-las a grupos ao invés de aplicá-las a tuplas. Ex:

– Encontre quais agências possuem média dos saldos aplicados em conta maior que R$1.200.

select nome_ag, avg (saldo)

from conta

group by nome_ag

having avg (saldo) > 1.200

Page 25: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

25

– Para contar o número total de registros em uma Tabela, utilizamos a função count (*).

– Encontre o número de registros da Tabela clienteselect count (*)from cliente

– A SQL não permite o uso do distinct com count (*)

– Se uma cláusula where e having aparecem na mesma consulta o predicado que aparece em where é aplicado primeiro.

– Exemplo: encontre o saldo médio para cada cliente que mora em Curitiba e tenha ao menos 3 contas.

select depositante.nome_cli, avg (saldo)from conta INNER JOIN depositante ON

depositante.num_conta = conta.num_conta INNER JOIN

cliente ON depositante.nome_cli = cliente.nome_cli

where cidade_cli = ‘Curitiba’group by depositante.nome_clihaving count (depositante.nome_cli) >= 3

Page 26: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

26

• VALORES NULOS– A SQL permite o uso do valor nulo para indicar ausência de

informação. – Pode-se utilizar a palavra is null para testar a existência de

valores nulos. – Ex: encontre todos os números de empréstimo que

aparecem na Tabela empréstimo com valores nulo para totalselect num_empfrom emprestimowhere total is null

– O predicado is not null testa a ausência de valores nulos

– O resultado de uma expressão aritmética (+, -, * e /) é nula se qquer um dos valores de entrada for nulo.

Page 27: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

27

– Comparações envolvendo valores nulos pode ser visto como false. No entanto algumas versões tratam o resultado dessas comparações como unknown (desconhecido)

– Funções agregadas podem tratar valores nulos usando a seguinte regra: todas as funções agregadas, exceto o count(*), ignoram os valores nulos dos seus conjuntos de valores de entrada.

Select sum (total)from emprestimo

Page 28: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

28

• 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_clifrom devedorwhere nome_cli in (select nome_cli

from depositante)

Page 29: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

29

– 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)

– Ex3: Encontre todos os clientes que tenham um empréstimo e cujos os nomes não sejam nem “Smith” nem “Jonas”

select distinct nome_cli from devedor where nome_cli not in (‘Smith’, ‘Jonas’)

– Ex4: Encontre todos os clientes que tenham tanto uma conta qto um empréstimo na agência “Batel”

select nome_cli,nome_agfrom devedor INNER JOIN emprestimo ON devedor.num_emp=emprestimo.num_empwhere nome_ag = 'Batel' and nome_cli in

(select nome_cli from depositante INNER JOIN conta ON

depositante.num_conta = conta.num_conta)

Page 30: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

30

• 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.200select 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

Page 31: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

31

• 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_agfrom agenciawhere 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

Page 32: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

32

– 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_agfrom agenciawhere 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_agfrom contagroup by nome_ag having avg (saldo) >= all (select avg (saldo)

from conta group by nome_ag)

Page 33: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

33

• 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.

Page 34: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

34

• UPDATE– modifica valores de tuplas sem alterar todos os valores.– Ex1: Dê a todos os saldos 5% como pagamento da taxa de juros

update contaset 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 contaset saldo = saldo * 0.06where saldo > 10.000

update contaset saldo = saldo * 0.05where saldo < = 10.000

– Ex3: Pague 5% de taxa de juros para as contas cujo o saldo seja maior que a média dos saldos.

update contaset saldo = saldo * 0.05where saldo > (select avg (saldo)

from conta)

Page 35: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

35

• DELETE– podemos remover somente tuplas inteiras. A remoção é expressa por:

delete from rwhere P

– o comando delete encontra primeiro todas as tupla t em r para os quais P(t) é verdadeira, e então remove-as de r.

– Pode-se ter uma cláusula where vazia. Ex:delete from empréstimo // remove todos os registros

– Exemplo1: remova todos os registros de contas do cliente “Smith”.delete from depositantewhere nome_cli = ‘Smith’

– remova todas as contas de cada uma das agências localizadas em “ctba”delete from contawhere nome_ag in (select nome_ag

from agencia where cidade_ag = ‘ctba’)

– Ex: remova os registros de todas as contas com saldos abaixo da média.delete from contawhere saldo < (select avg (saldo)

from conta)

Page 36: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

36

• VISÕES (VIEW)– Definimos uma visão:

create view v as <expressão da consulta>

– Ex1: suponha que desejemos criar uma visão denominada todos_clientes que seja composta dos nomes das agências e nomes dos clientes que tenham uma conta ou um empréstimo na agência Batel.

create view todos_clientes as(select nome_ag, nome_cli

from depositante INNER JOIN conta ON depositante.num_conta=conta.num_conta

where nome_ag = ‘Batel’)

union

(select nome_ag, nome_cli

from devedor INNER JOIN emprestimo ON devedor.num_emp = emprestimo.num_emp

where nome_ag = ‘Batel’)

Page 37: 1 Banco de Dados SQL Elaini Simoni Angelotti elaini.angelotti@gmail.com

37

• Ex2: Crie uma visão que mostre a soma dos totais de todos os empréstimos de cada agência.create view emprestimo_total_agencia (nome_agencia,emprestimo_total) as

select nome_ag, sum (total)from emprestimo

group by nome_ag

• 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

insert into agencia_emprestimo values (‘Batel’, 998)

– na Tabela empréstimo (Tabela real) será inserido: (‘Batel’, ‘L-998l’, null)

– Regra para alterações por meio de visões na maioria dos banco de dados:

• uma alteração por meio de visão somente é permitida se a visão em questão é definida em termos de uma Tabela real do banco de dados.