Você está na página 1de 79

Sumrio

SQL - Strucured Query Language


Definio de dados Interrogao Manipulao de dados

Gabriel David FEUP - Rua Dr. Roberto Frias 4200-465 Porto - PORTUGAL Tel. 351-225081408 - Fax: 351-225081440

Email: gtd@fe.up.pt URL: http://www.fe.up.pt/~gtd

Origem

Introduzida em 1976 como LMD para System R (IBM) Primeira implementao comercial em 1979 (Oracle) Linguagem padro de acesso a BD relacionais Normalizao ANSI e ISO: SQL89, SQL92, SQL3 Objectivo principal

Tratamento unificado da definio, manipulao e controlo dos dados, sendo til para todas as classes de utilizadores.

SQL - 2

Acesso BD

Cliente (sqlplus, PL/SQL, SQL embutido JDBC, ODBC)

Servidor

SQL - 3

BD Biblioteca

esquema conceptual datar


nr LIVRO autor preo titulo requisio cod nome LEITOR cpostal cidade

datae Cada leitor s pode requisitar cada livro uma vez por dia.

esquema relacional

livro(nr, titulo, autor, preo) leitor(cod, nome, cpostal, cidade) req(liv, lei, datar, datae)
SQL - 4

Criao de uma tabela

create table tabela


( coluna tipo restrio_de_coluna, coluna tipo restrio_de_coluna, ..., restrio_de_tabela, ... );

em Access, a criao de tabelas feita pela interface grfica

SQL - 5

Tipos de dados em Oracle


char(n)

cadeia de caracteres de comprimento fixo 1n255


cadeia de caracteres de comprimento varivel, de valor mximo 1n4000 nmero com preciso 1p38 e escala -84s127 data entre 4712-01-01 AC e 4712-12-31 DC dado binrio de comprimento n

varchar2(n) number(p,s)

date

raw(n) long
cadeia de caracteres de comprimento varivel at 2GB
dado binrio de comprimento varivel at 2GB endereo de uma linha
SQL - 6

long raw rowid

Caracteres e nmeros

em varchar2

necessrio especificar o comprimento mximo n erro se o comprimento efectivo ultrapassar n, mesmo que com um valor inferior a 4000

em number

pode usar-se notao cientfica, ex. 6.34e-13, com expoente entre -130 e +125 s number equivalente a float number(p) inteiro com p dgitos exemplos:
valor 7456123.89 7456123.89 7456123.89 7456123.89 7456123.89 7456123.89 tipo number number(9) number(9,2) number(9,1) number(6) number(7,-2) memria 7456123.89 7456124 7456123.89 7456123.9 excede preciso 7456100 SQL - 7

Datas

em date

este tipo destina-se a memorizar momentos, por exemplo, '12Aug-1995 20:37:19' o formato por omisso 'DD-MON-YY' mas possvel especificar outros
Comando Oracle:
ALTER SESSION SET NLS_DATE_FORMAT= YYYY-MM-DD HH24:MI:SS

cadeias com o formato correcto so automaticamente convertidas para o tipo date


Para forar converses, usar TO_DATE( campo, formato) e TO_CHAR( campo, formato)

SQL - 8

Tipos de dados em Access


Text

cadeia de caracteres de comprimento varivel at 255


cadeia de caracteres de comprimento varivel at 64Kbytes no indexado para documentos longos, Word, Excel, etc usar objectos OLE nmeros inteiros ou reais Autonumber, nmero incrementado automaticamente data incluindo a hora Booleano
SQL - 9

Memo

Number

Date

Yes/No

Restries de coluna

Estas restries s se referem a uma coluna not null - obrigatrio

null - opcional, i.e., aceita valores nulos

unique - no admite valores repetidos na coluna primary key - chave primria

= unique + not null

[pique a chave em Access]

references tabela(coluna)

[definir no quadro Relationship em Access] identifica a chave primria ou alternativa de uma tabela referida por uma restrio de integridade referencial; a opo on delete cascade faz com que apagar uma chave referida apague automaticamente todos os respectivos referentes especifica uma condio que todas as linhas da tabela tm que satisfazer; a condio s se refere a valores na linha corrente
SQL - 10

check(condio)

Restries de tabela

podem referir-se a mais do que uma coluna, como


primary key(col, col, ...) [seleccionar todas as colunas da chave, antes de picar a chave em Access] foreign key(col, col, ...) references tabela(col, col, ...)

unique e primary key criam automaticamente ndices


criao explcita, por exemplo por razes de eficincia [indicar se se pretende indexar uma coluna na sua definio] create index nome on tabela(col asc, col desc, ...)

informao sobre tabelas existentes: describe tabela

comando do programa sqlplus, no da linguagem SQL

SQL - 11

Dicionrio de dados

Descreve a estrutura da BD Contm vistas


user_* (objectos pertencentes ao utilizador) all_* (objectos acessveis ao utilizador) dba_* (todos os objectos na BD) user_objects - objectos de todos os tipos user_catalog, cat - tabelas, vistas, sinnimos (resumida) user_tables, user_tab_columns - tabelas e vistas, suas colunas user_indexes, user_ind_columns - ndices, colunas indexadas user_views - definio das vistas user_source - cdigo de procedimentos, funes e pacotes user_constraints, user_cons_columns - restries, suas colunas user_dependencies - dependncias entre objectos

Exemplos

SQL - 12

Carregamento das tabelas


insert into tabela values(val, val, ...);

adiciona uma linha com todos os valores e pela ordem correcta adiciona uma linha s com os valores das colunas referidas insert into req values(130, 6, '95-06-15', null); equivale a insert into req(liv, lei, datar) values(130,6,'95-06-15');

insert into tabela(col, col, ...) values(val, val, ...);


drop tabela;

elimina a tabela se no houver referncias para essa tabela ou se estas especificarem on delete cascade

SQL - 13

Definio do esquema em SQL


create table livro
( nr titulo autor preo
cod nome cpost cidade

number(4) primary key, varchar2(20) not null, varchar2(20), number(4) );


number(4) primary key, varchar2(20) not null, number(4), varchar2(20) );

create table leitor


(

create table req


( liv number(4) references livro, lei number(4) references leitor, datar date, datae date, constraint req_ck check datar<=datae, constraint req_pk primary key(liv, lei, datar) );

SQL - 14

BIBLIOTECA
LIVRO
NR 100 110 120 130 140 150 TITULO Os Maias AUTOR Ea de Queiroz PREO 1100$ 490$

Os Lusadas Lus de Cames A Selva A Capital Terra Fria A Relquia

Ferreira de Castro 700$ Ea de Queiroz 1050$

Ferreira de Castro 850$ Ea de Queiroz 900$

SQL - 15

BIBLIOTECA (2)
LEITOR COD NOME
1 2 3 4 5 6 7 Antnio Chico Marina Zeca Manuel CPOST 1000 4000 1100 4100 4400 CIDADE Lisboa Porto Lisboa Porto Gaia Matosinhos Lisboa
SQL - 16

Mafalda 4470 Rui 1200

BIBLIOTECA (3)
REQ LIV LEI DATAR
100 1 DATAE 95-01-01 95-02-06

110
120 100 130 140 100 110 150 130

2
2 3 6 5 1 4 6 5

95-01-05 95-03-05
95-02-15 95-02-25 95-03-10 95-03-20 95-06-15 95-04-15 95-05-02 95-04-30 95-05-08 95-04-21 95-04-26 95-06-30 95-07-08 95-07-04 95-07-12
SQL - 17

Primeira pergunta
1 Mostrar toda a informao sobre todos os livros. select * from livro;

as perguntas podem ocupar mais do que uma linha e em formato livre, por uma questo de legibilidade fim da pergunta: ; sintaxe errada : < mensagem explicativa> todas as colunas da tabela : * obrigatrio haver select e from
quando no existe a tabela usa-se a pseudo-tabela dual, ex. select 25*363+8 from dual;

SQL - 18

Resposta 1
NR 100 110 120 130 TITULO Os Maias Os Lusadas A Selva A Capital AUTOR Ea de Queiroz Lus de Cames Ferreira de Castro Ea de Queiroz PREO 1100$ 490$ 700$ 1050$

140 150

Terra Fria A Relquia

Ferreira de Castro Ea de Queiroz

850$ 900$
SQL - 19

Seleco simples
2 Listar cdigo e nome dos leitores cujo cdigo menor que 5. select cod, nome from leitor where cod < 5;

select-from-where assemelha-se ao clculo relacional e faz uma escolha horizontal (seleco), seguida de uma escolha vertical (projeco) as perguntas (Query) ficam armazenadas na BD, de onde podem ser reutilizadas.

SQL - 20

Resposta 2
COD 1 2 NOME Antnio Chico

3
4

Marina
Zeca

SQL - 21

Filtro mais elaborado


3 Listar o nome e a cidade dos leitores com nome a comear por 'M' e cdigo entre 2 e 5. select nome, cidade from leitor where nome like 'M%' and cod between 2 and 5;
NOME Marina Manuel CIDADE Lisboa Gaia

select nome, cidade from leitor where nome like 'M%' and cod >= 2 and cod <=5;
SQL - 22

Pesquisa com cadeias

Comparao com uma cadeia usando like:

% vale por qualquer sequncia de 0 ou mais caracteres: nome like 'M%' (Oracle) nome like 'M*' (Access)
comparao verdadeira com 'Marina', 'M'

O _ (?) vale por qualquer letra (uma e uma s); nome like 'M_r%' nome like 'M?r*'
comparao verdadeira com 'Mar', 'Maria', 'Moreira'

Usando = faz-se a igualdade literal:


nome = 'M_r%'
s verdade se nome for 'M_r%'

SQL - 23

Eliminao de repetidos
4 Seleccionar as cidades com cdigo postal superior a 2000. select cidade from leitor where cpost > 2000;

CIDADE Porto Porto Gaia Matosinhos

como vrios leitores so da mesma cidade vo aparecer valores repetidos no resultado

SQL - 24

Resposta com conjunto


select distinct cidade from leitor where cpost > 2000;
forar valores distintos tem como efeito lateral a ordenao

CIDADE
Gaia Matosinhos Porto

SQL - 25

Filtro complexo
5 Seleccionar os livros do Ea com preo superior a 1000$00 e todos os livros de preo inferior a 750$00 indicando o autor, o ttulo, o preo e o nmero. select autor, titulo, preco, nr from livro where autor like %Eca% and preco > 1000 or preco < 750; AUTOR Ea de Queiroz TITULO Os Maias PREO 1100$ NR 100

Lus de Cames
Ea de Queiroz

Os Lusadas
A Capital

490$
700$ 1050$

110
120 130
SQL - 26

Ferreira de Castro A Selva

Expresses aritmticas
6 Escrever o nmero de dias que durou cada requisio nos casos em que duraram menos que 10 dias. select liv, lei, datae - datar "Duracao" from req where (datae - datar) <= 10; para renomear uma coluna, indica-se o novo nome a seguir especificao da mesma, entre aspas parmetros: podia-se incluir na pergunta uma varivel a preencher em tempo de execuo select liv, lei, datae - datar "Duracao" from req where (datae - datar) <= [intervalo];

SQL - 27

Expresses lgicas
LIV 120 100 100 110 130 LEI 2 3 1 4 5 Durao 10 10 8 5 8

operadores reconhecidos, por ordem de precedncia: operadores aritmticos


+ , - (unrio) *,/ + , - (binrio); || (concatenao)

operadores de comparao operadores lgicos


not and or
SQL - 28

Operadores de comparao
=, <>, <, >, <=, >= [not] in igual, diferente, menor, maior, menor ou igual, maior ou igual pertena a conjunto

[not] between x <= valor <= y x and y exists x [not] like y is [not] null Sub-pergunta com pelo menos uma linha no resultado compara com padro valor nulo

SQL - 29

Dificuldades com operadores

in
select * from leitor where cidade in ('Lisboa','Porto')

not in d nulo (sem resultado) se algum dos elementos do conjunto for nulo cidade not in ('Lisboa','Porto', null) equivalente a qualquer comparao com nulo d nulo, excepto a is null.
SQL - 30

cidade != 'Lisboa' and cidade != 'Porto' and cidade != null

Ordenao da sada
7 Obtenha uma lista com os autores, livros e preo ordenada decrescentemente por autor e decrescentemente por preo.

select autor, titulo, preco from livro order by autor desc, preco desc;
AUTOR Lus de Cames TITULO PREO 850$ 700$ 1100$ 1050$ 900$
SQL - 31

Os Lusadas 490$

Ferreira de Castro Terra Fria Ferreira de Castro A Selva Ea de Queiroz Ea de Queiroz Ea de Queiroz Os Maias A Capital A Relquia

Funes de agregao
8 Obtenha o preo mdio, valor total e o nmero de livros da biblioteca, bem como o valor do livro mais caro e o do mais barato (ufff...).

select avg(preo), sum(preco), count(*), max(preo), min(preo) from livro;


avg(preco) sum(preco) count(*) 848.33 5090.00 6 max(preco) min(preco) 1100.00 490.00

SQL - 32

Agrupamento de linhas
9 Calcule o preo mdio dos livros de cada autor.

select autor, avg(preco) from livro group by autor;


AUTOR AVG(PREO) 1016.66

} } }

Ea de Queiroz

Lus de Cames
Ferreira de Castro

490.00
775.00

SQL - 33

Agrupamento de linhas com filtro


9 Calcule o preo mdio dos livros de cada autor, mas s para mdias inferiores a 500$. select autor, avg(preco) from livro where avg(preco) < 500 group by autor; errado!

select autor, avg(preco) from livro group by autor having avg(preco) < 500;

having selecciona as linhas da agregao como where selecciona as linhas da tabela base

AUTOR Lus de Cames

AVG(PREO) 490.00
SQL - 34

Perguntas encaixadas
10 Obtenha o ttulo e preo do livro mais caro dos autores que comeam por E. Pergunta (1 tentativa, a mais lgica ...): select titulo, max(preco) from livro where autor like 'E%'; TITULO Os Maias

PREO 1100$

A Capital

1100$

A Relquia 1100$

SQL - 35

Subpergunta
Na verdade, este pedido constitudo por duas perguntas: 1 Qual o preo mximo dos livros escritos por autores que comeam por E? 2 Qual o ttulo do livro cujo preo igual ao determinado acima e cujo autor comea por E (esta condio de comear por E no redundante...)? select titulo, preco from livro where preco = ( select max(preco) from livro where autor like 'E%' ) and autor like 'E%';

TITULO Os Maias

PREO 1100$

SQL - 36

Exagerando...
11 Seleccione o ttulo do segundo livro mais caro. select titulo from livro where preco = ( select max(preco) from livro where nr not in ( select nr from livro where preco = ( select max(preco) from livro)));

TITULO

A Capital

Demonstra-se teoricamente que qualquer relao que se consiga extrair da BD com SQL, extrai-se com uma nica pergunta (nem sempre d muito jeito...).
SQL - 37

Anlise
1) preomax := select max(preco) from livro; determina o preo mximo de todos os livros. 2) numeromax := select nr from livro where preco = preomax; nmeros dos livros que custam o preo mximo. 3) segundopreo := select max(preco) from livro where nr not in numeromax; mximo preo dos livros cujo nmero diferente do dos livros com preo mximo (ou seja, o segundo maior preo...). 4) resultado := select titulo from livro where preco = segundopreo; determina o ttulo dos livros com preo igual ao segundo maior preo. E j est!
SQL - 38

Perguntas com vrias tabelas


12 Escreva os ttulos e datas de requisio dos livros requisitados depois de 95-01-01.
TITULO
Os Maias Os Lusadas A Selva

DATAR
95-01-01 95-01-05 95-02-15

Os Maias

95-03-10
95-06-15 95-04-15 95-04-30

select titulo, datar from livro, req where datar >= '95-01-01' and nr = liv ;

A Capital Terra Fria Os Maias

Os Lusadas
A Relquia A Capital

95-04-21
95-06-30 95-07-04

SQL - 39

Ncleo da lgebra relacional

o conjunto de clusulas select-from-where equivalente a um produto cartesiano, seguido de uma seleco e de uma projeco: select campo1, ..., campon from tabela1, ..., tabelam where F; <=> campo1,...,campon(sF (tabela1 ... tabelam)) <=> campo1,...,campon (tabela1 F ... F tabelam)
SQL - 40

Incluso em conjunto
13 Liste, para cada requisio, o ttulo do livro e o nome do leitor, no caso de o cdigo postal ser 1000, 4000 ou 4470. select titulo, nome from livro, req, leitor where nr = liv and lei = cod and cpost in (1000, 4000, 4470);

pergunta equivalente a:
select titulo, nome from livro, req, leitor where nr = liv and lei = cod and (cpost =1000 or cpost = 4000 or cpost = 4470);

parnteses obrigatrios, atendendo precedncia


SQL - 41

Resposta 13

TITULO
Os Maias Os Lusadas A Selva A Capital Os Maias A Reliquia

NOME
Antonio Chico Chico Mafalda Antonio Mafalda

SQL - 42

Condies sobre tuplos


14 Quantos Antnios moram em Lisboa e quantos Zecas moram no Porto?
select nome, cidade, count(*) from leitor where (nome, cidade) in (('Antonio','Lisboa'),('Zeca', 'Porto')) group by nome, cidade;

(Oracle)

pergunta equivalente a:
select nome, cidade, count(*) from leitor where nome = 'Antonio' and cidade = 'Lisboa' or nome = 'Zeca' and cidade = 'Porto' group by nome, cidade;
SQL - 43

Resposta 14

NOME Antonio Zeca

CIDADE Lisboa Porto

COUNT(*) 1 1

SQL - 44

Agregao de agregao
15 Procure o livro cujas requisies tm maior durao mdia, exceptuando 'Terra Fria'. select titulo, avg(datae - datar) from livro, req where nr = liv and titulo ^= 'Terra Fria' group by titulo having avg(datae - datar) = ( select max(avg(datae - datar)) from req, livro where titulo ^= 'Terra Fria' and nr = liv group by titulo);

s faz sentido ter at dois nveis de operadores de agregao


SQL - 45

Autojuno
16 Obtenha a lista dos pares de pessoas que moram na mesma cidade. select p.nome, q.nome from leitor p, leitor q where p.cod != q.cod and p.cidade = q.cidade;

para responder a esta pergunta, precisamos de duas cpias da tabela de leitores; como no temos duas cpias fsicas, criamos duas cpias lgicas; p e q so alis para a mesma tabela Ex: p.cidade = q.cidade faz a juno das duas tabelas p e q sobre o atributo cidade.
SQL - 46

Subtraco de conjuntos
17 Obtenha os leitores que no requisitaram o livro 150. select nome from leitor where cod not in (select lei from req where liv = 150);

Pergunta alternativa:
(select cod from leitor) minus (select lei from req where liv = 150);

SQL - 47

Reunio e interseco
18 Quais os dias em que houve requisies ou entregas de livros? E quais os dias em que houve requisies e entregas?

Pergunta da reunio:
(select datae from req) union (select datar from req);

Pergunta da interseco:
(select datae from req) intersect (select datar from req);

SQL - 48

Operador all
19 Quais os livros mais caros do que (todos) os livros do Ferreira de Castro? select titulo Access from livro select titulo where preco > all from livro (select preco where preco > (select max(preco) from livro from livro where autor = where autor = 'Ferreira de Castro'); 'Ferreira de Castro');

operador all exige que a comparao seja verdadeira para todos os valores do resultado da subpergunta.
SQL - 49

Operador some (any).


20 Quais os livros mais baratos do que algum livro do Ea? select titulo from livro where preco < some -- any (select preco from livro where autor like 'Ea%');

select titulo from livro where preco < (select max(preco) from livro where autor like 'Ea%');

operador some (any) exige que a comparao seja verdadeira para pelo menos um dos valores do resultado da subpergunta
SQL - 50

Operadores in e exists
21 Quais os livros requisitados depois de 95-06-20? select titulo from livro where nr in (select liv from req where datar > '95-06-20') ;

Perguntas alternativas: select titulo from livro where exists -- where 0 < (select * -- (select count(*) from req where livro.nr = liv and datar > '95-06-20') ;
SQL - 51

Sub-pergunta varivel

operador exists testa se o resultado da sub-pergunta no vazio (o mesmo que 0 <); not exists 0 = Sub-pergunta constante: na primeira verso, a sub-pergunta pode ser substituda pelo seu resultado (130,150) e este usado na pergunta exterior avaliao de dentro para fora Sub-pergunta varivel: na segunda verso, para cada tuplo da pergunta exterior (linha de livro), a sub-pergunta interior tem que ser reavaliada, pois contm uma referncia a um atributo (nr) da tabela declarada na pergunta exterior avaliao de fora para dentro; esta referncia tem que ter prefixo livro.nr.

SQL - 52

Contagem
22 Obtenha os nmeros e ttulos dos exemplares que foram requisitados mais do que uma vez. select nr, titulo from livro, req where nr = liv group by nr, titulo having count(*) > 1 ; select nr, titulo from livro, req r1, req r2 where nr = r1.liv and nr = r2.liv and r1.datar != r2.datar;
Pergunta alternativa (se em cada dia, cada exemplar for requisitado no mximo uma vez):

select nr, titulo from livro, req where nr = liv and datar != some (select datar from req where livro.nr = liv);
SQL - 53

Pertena de tuplos
23 Ache o nmero, ttulo e preo das obras que tm mais do que um exemplar na biblioteca, com preo inferior a 900$00. select nr, titulo, preco from livro l where (titulo, autor) in (select titulo, autor from livro where nr != l.nr) and preco < 900.00;

substituindo a subpergunta por uma juno e mais restries: select l1.nr, l1.titulo, l1.preco from livro l1, livro l2 where l1.preco < 900.00 and l1.autor = l2.autor and l1.titulo = l2.titulo and l1.nr != l2.nr;

esta formulao menos clara


SQL - 54

Sub-pergunta varivel

estratgia de diviso e conquista uma formulao alternativa mais clara: select nr, titulo, preco from livro l where preco < 900.00 and 1< (select count(*) from livro where titulo = l.titulo and autor = l.autor) ;

SQL - 55

Quantificao universal
24 Quais os leitores que leram todos os livros? select nome -- R Access from leitor where cod not in (select cod -- lei(T-S) from livro, leitor -- T where not ((nr, cod) in (select liv, lei -- S Manipulao de conjuntos: from req)));

T = nr (livro) x cod (leitor) S = liv, lei(req) R = leitor - lei(T-S)


SQL - 56

Expresses de clculo

{nome | "nr, LIVRO(nr,,,)

$cod: REQ(nr,cod,,) LEITOR(cod,nome,,)}


<=>

{nome | $nr : LIVRO(nr,,,)

$cod (REQ(nr,cod,,) LEITOR(cod,nome,,))}

Leis de De Morgan (A B) = A B (A B) = A B "x, P(x) = $x: P(x) $x: P(x) = "x, P(x)
SQL - 57

Formulaes alternativas

select nome from leitor where not exists (select nr from livro where not exists (select lei from req where liv = nr and lei = cod ));

formulao directa das expresses de clculo, usando uma sub-pergunta varivel para cada elemento do produto cartesiano leitor x livro e o operador not exists

SQL - 58

Estratgia da contagem
select nome from leitor where cod in (select lei from req group by lei having count(distinct liv) = (select count(*) from livro));

operador distinct crucial para no contar duplicados


SQL - 59

Insero
25 Faa uma requisio dos livros 100 e 120 pelo leitor 4 em 88-07-11. insert into req(liv,lei,datar) values(120, 4, '88-07-11'); insert into req(liv,lei,datar) values(100, 4, '88-07-11') ;

se se dessem valores a todos os atributos no era necessrio indicar a lista de atributos a seguir ao nome da tabela os atributos no preenchidos ficam com os valores por omisso definidos para a coluna ou com valor nulo
SQL - 60

Memorizao de resultado
26 Insira, na tabela dos perdidos, os livros requisitados h mais de 300 dias. create table perdidos ( nr number(4) primary key, titulo varchar2(20) not null, autor varchar2(20), preo number(4) ); insert into perdidos (select * from livros where nr in (select liv from req where sysdate - datar > 300 and datae is null );

a tabela perdidos tem que j ter sido criada existe a forma create table perdidos as (select ... sysdate uma funo que devolve a data do dia
SQL - 61

Apagar
27 Retire os livros mencionados na pergunta anterior da tabela dos livros. delete livro where nr in (select liv from req where sysdate - datar > 300 and datae is null) ;

s se pode apagar numa tabela de cada vez pode ser usada qualquer pergunta para seleccionar os registos a apagar.
SQL - 62

Modificar
28 Actualize o preo dos livros de cdigo superior a 130 com 20% de inflao. update livro set preco = preco * 1.2 where nr > 130;

s se pode actualizar numa tabela de cada vez, mas pode haver set para vrios atributos em simultneo

a clusula set admite qualquer expresso para modificar um campo, inclusiv o resultado de uma pergunta, se retornar apenas um valor
SQL - 63

Vistas
29 Crie uma vista para os livros requisitados indicando o titulo do livro, o nome do leitor e a durao da requisio. create view requisitado(obra,fulano,dura) as (select titulo, 'Sr. ' || nome, sysdate-datar from req, livro, leitor where liv=nr and lei=cod and datae is null); select * from requisitado;

se no se indicarem nomes para as colunas da vista ficam os das expresses do select s se podem alterar as vistas que assentem numa nica tabela base o operador || concatena cadeias de caracteres
SQL - 64

Juno externa
30 Crie uma vista com o cdigo e o nome do leitor e o nmero de livros que j requisitou. create view estatistica(cod,nome,total) as (select cod, nome, count(distinct liv) from req, leitor where lei (+) = cod group by cod, nome);

o smbolo (+) indica que a juno implcita no = externa na tabela de leitor; assim, mesmo o leitor 7, que no fez nenhuma requisio, aparece na vista.
SQL - 65

Lngua natural
31 Quais os cdigos dos leitores que requisitaram o livro 110 ou o livro 120? Quais os cdigos dos leitores que requisitaram o livro 110 e o livro 120? select lei from req where liv = 110 or liv = 120;

para a disjuno, a resposta inclui os leitores 2 e 4; no caso da conjuno a pergunta


select lei from req where liv = 110 and liv = 120;
SQL - 66

Conjuno

d um resultado vazio quando se estava espera que desse 2! O problema que no h nenhuma requisio que seja simultaneamente dos livros 110 e 120.

reformulao, considerando que se tem que comparar duas requisies:


select a.lei from req a, req b where a.lei=b.lei and a.liv = 110 and b.liv = 120;

a lngua natural muito traioeira.


SQL - 67

Vistas implcitas
32 Quais os ttulos dos livros que esto requisitados?

select titulo from livro, (select liv, lei from req where datae is null) requisitados where nr = requisitados.liv;

Em SQL/92 possvel usar sub-perguntas como se fossem vistas, em vrias situaes, em especial na clusula from.

SQL - 68

Junes explcitas
33 Qual o nmero de livros requisitados por cada leitor, indicando o seu cdigo e nome. select cod, nome, count(liv) from req inner join leitor on lei=cod group by cod, nome;

Em SQL/92 possvel usar junes explcitas como perguntas ou na clusula from, com as variantes outer, inner, natural (no caso do Access em vez de outer, usar left e right).

SQL - 69

Outras instrues teis


34 Coloque comentrios na tabela e nas colunas de requisies. comment on table req is 'Uma requisio s de um livro por um autor' comment on column req.datae is 'Valor nulo significa livro ainda no devolvido'

Documentao Oracle em

http://tahiti.oracle.com

SQL - 70

Restries de integridade
35 Desactive a restrio de integridade referencial dos cdigos de leitor, para poder colocar um cdigo de um leitor no registado. insert into req values (120, 10, '99-12-01', '99-12-25'); ORA-02291: integrity constraint (GTD.SYS_C006905) violated - parent key not found alter table req disable constraint SYS_C006905; alter table req enable constraint SYS_C006905;

Se introduzir um registo que viole uma restrio, depois no possvel reactiv-la.

SQL - 71

Sequncias
36 Crie uma sequncia para gerar automaticamente nmeros de livro.
create sequence num_livro start with 200 increment by 10; insert into livro values( num_livro.nextval, Memorial do convento, Jos Saramago, 2000); select num_livro.currval from dual;

Sequncia um contador autnomo que pode ser usado para gerar chaves primrias <seq>.currval d o valor corrente <seq>.nextval d o valor seguinte Garante-se que dois pedidos nextval concorrentes do valores diferentes
SQL - 72

Tratamento de valores nulos


37 Calcule as duraes de todas as requisies, contabilizando at data actual os no entregues.

Utilizar a funo NVL( col, valorSeNulo )

LIV 100 110

LEI 1 2

DURACAO 36 59

Devolve o valor col se no for nulo ou o valorSeNulo caso col seja nulo select liv, lei, nvl(datae,sysdate)-datar duracao from req

120
100 130 140

2
3 6 5

10
10 5974,0265625 17

100

1
4 6

8
5 8

Existe uma NVL2(T, S, N) que, se o teste for positivo d S, se no d N

110 150

SQL - 73

Tabela de converso de valores


38 Substitua Lisboa por Alfacinha, Porto por Tripeiro, e Gaia por Marroquino, deixando os outros casos com Ignoto.
select nome, decode(cidade, 'Lisboa', 'Alfacinha', 'Porto', 'Tripeiro', 'Gaia', 'Marroquino', 'Ignoto') origem from leitor

Nome Antonio Chico Marina Zeca Manuel

Origem Alfacinha Tripeiro Alfacinha Tripeiro Marroquino Ignoto Alfacinha

Relativamente a cada valor da coluna Cidade, Mafalda se coincidir com o 2 valor, mostra o 3, se Rui coincidir com o 4, mostra o 5, se no coincidir com nenhum, d o ltimo

SQL - 74

Converso de tipos de dados


39 Houve um bug do ano 2000 e as datas de requisio ficaram todas no sculo XXI. Reponha as datas a comear em 1999 .
update req set datar = to_date('19' || to_char(datar, 'YY-MM-DD'), 'YYYY-MM-DD')

To_char converte nmeros e datas para cadeias de caracteres

possvel indicar o formato dessa converso como 2 argumento

To_date e To_number fazem a operao inversa

SQL - 75

Duas pseudo-colunas
40 Crie uma vista sobre os livros em que, para alm das colunas respectivas se mostre tambm o nmero de linha do resultado e o endereo interno para pesquisas rpidas.
select rownum, rowid, livro.* from livro

Rownum nmero de linha da tabela resultante da consulta, antes de eventual ordenao

Serve para limitar s primeiras n linhas um resultado muito extenso Permite acessos muito rpidos mas afectado por operaes de exportao/importao, pelo que no pode ser usado de forma geral

Rowid endereo interno da linha na BD

SQL - 76

Resultado
rownum 1
2 3 4 5

rowid

nr

titulo Os Maias
Os Lusiadas A Selva A Capital Terra Fria

autor Eca de Queiroz


Luis de Camoes Ferreira de Castro Eca de Queiroz Ferreira de Castro

preo 1100
490 700 1050 850

AAA1q8AAHA 100 AA31CAAA


AAA1q8AAHA 110 AA31CAAB AAA1q8AAHA 120 AA31CAAC AAA1q8AAHA 130 AA31CAAD AAA1q8AAHA 140 AA31CAAE

AAA1q8AAHA 150 AA31CAAF

A Reliquia

Eca de Queiroz

900

SQL - 77

Top-ten
41 Obtenha a lista dos trs livros mais caros. Primeira soluo Titulo
select titulo, preco from livro where rownum < 4 order by preco desc

Preo 1100 700

Os Maias A Selva

Os Lusiadas
Titulo Os Maias A Capital A Relquia

490
Preo 1100 1050 900

Formulao correcta

select titulo, preco from ( select titulo, preco from livro order by preco desc) where rownum < 4

SQL - 78

Dados hierrquicos
42 Mostre os registos ordenados pela hierarquia.
Distrito(codigo, nome)

Concelho(codigo, nome, distrito)


Freguesia(codigo, nome, concelho)

Divisoes(codigo, nome, pai)

select codigo, nome from divisoes start with pai is null connect by prior codigo=pai

Devolve as linhas ordenadas pela rvore implcita nos dados


SQL - 79