SQL
SQL
Gabriel David FEUP - Rua Dr. Roberto Frias 4200-465 Porto - PORTUGAL Tel. 351-225081408 - Fax: 351-225081440
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
Servidor
SQL - 3
BD Biblioteca
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
SQL - 5
char(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
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
SQL - 8
Text
Memo
Number
Date
Yes/No
Restries de coluna
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
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, ...)
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, ...)
SQL - 11
Dicionrio de dados
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
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');
drop tabela;
elimina a tabela se no houver referncias para essa tabela ou se estas especificarem on delete cascade
SQL - 13
SQL - 14
BIBLIOTECA
LIVRO
NR 100 110 120 130 140 150 TITULO Os Maias AUTOR Ea de Queiroz PREO 1100$ 490$
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
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
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
select nome, cidade from leitor where nome like 'M%' and cod >= 2 and cod <=5;
SQL - 22
% 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'
SQL - 23
Eliminao de repetidos
4 Seleccionar as cidades com cdigo postal superior a 2000. select cidade from leitor where cpost > 2000;
SQL - 24
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
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
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
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
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...).
SQL - 32
Agrupamento de linhas
9 Calcule o preo mdio dos livros de cada autor.
} } }
Ea de Queiroz
Lus de Cames
Ferreira de Castro
490.00
775.00
SQL - 33
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
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
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 ;
Os Lusadas
A Relquia A Capital
95-04-21
95-06-30 95-07-04
SQL - 39
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);
Resposta 13
TITULO
Os Maias Os Lusadas A Selva A Capital Os Maias A Reliquia
NOME
Antonio Chico Chico Mafalda Antonio Mafalda
SQL - 42
(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
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);
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
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;
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)));
Expresses de clculo
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));
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;
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.
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
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;
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
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
110 150
SQL - 73
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
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
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
SQL - 76
Resultado
rownum 1
2 3 4 5
rowid
nr
titulo Os Maias
Os Lusiadas A Selva A Capital Terra Fria
preo 1100
490 700 1050 850
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
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)
select codigo, nome from divisoes start with pai is null connect by prior codigo=pai