Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Apostila sobre o
Banco de Dados Postgre
Ano 2005
2
Introduo .......................................................................................................... 5
Parte A: Bsico................................................................................................... 6
1.
2.
3.
4.
5.
6.
7.
4.1.
Tipo Numrico...................................................................................... 9
4.2.
4.3.
4.4.
5.2.
5.3.
5.4.
5.5.
Restrio de unicidade....................................................................... 14
5.6.
Restrio de verificao..................................................................... 15
5.7.
5.8.
Chave estrangeira.............................................................................. 16
6.2.
6.3.
Adicionando restrio......................................................................... 18
6.4.
3
8.
9.
Alias de coluna................................................................................... 22
9.2.
Filtrando os dados.............................................................................. 23
9.3.
9.4.
9.5.
9.6.
9.7.
9.8.
9.9.
9.10.
10.
10.1.
11.
Transaes..................................................................................... 37
Expresso condicional........................................................................... 39
12.1.
CASE.............................................................................................. 39
12.2.
COALESCE .................................................................................... 41
12.3.
NULLIF ........................................................................................... 41
13.
14.
14.1.
14.2.
14.3.
4
14.4.
15.
Agrupando os dados.............................................................................. 47
15.1.
GROUP BY .................................................................................... 47
15.2.
15.3.
16.
Expresses de subconsulta................................................................... 51
16.1.
EXISTS........................................................................................... 51
16.2.
IN.................................................................................................... 52
16.3.
NOT IN ........................................................................................... 53
17.
View (Vises)......................................................................................... 54
Introduo
O PostgreSQL um sistema de gerenciamento de banco de dados objetorelacional (SGBDOR) , ele foi o pioneiro em muitos conceitos objeto-relationais
que agora esto se tornando disponveis em alguns bancos de dados
comerciais.
Desenvolvido no Departamento de Cincia da Computao da Universidade da
Califrnia em Berkeley. O projeto POSTGRES, liderado pelo Professor Michael
Stonebraker, foi patrocinado pelas seguintes instituies: Defense Advanced
Research Projects Agency (DARPA); Army Research Office (ARO); National
Science Foundation (NSF); e ESL, Inc.
O PostgreSQL descende deste cdigo original de Berkeley, possuindo o cdigo
fonte aberto. Fornece suporte s linguagens SQL92/SQL99, alm de outras
funcionalidades modernas.
Os Sistemas de Gerenciamento de Bancos de Dados Relacionais (SGBDR)
tradicionais suportam um modelo de dados que consiste em uma coleo de
relaes com nome, contendo atributos de um tipo especfico. Nos sistemas
comerciais em uso, os tipos possveis incluem nmero de ponto flutuante,
inteiro, cadeia de caracteres, monetrio e data.
Nesta apostila iremos aprender a como criar um banco de dados e sobre DDL
(Data Definition Language) Linguagem que os objetos que iro compor o
banco de dados (comandos de criao e atualizao da estrutura dos campos
da tabela, por exemplo) e DML (Data Manipulation Language) - Linguagem que
define os comandos de manipulao e operao dos dados (comandos de
consulta e atualizao dos dados das tabelas).
Parte A: Bsico
1. Convenes para a Linguagem SQL
Conveno nada mais que um padro que iremos utilizar para criar os
nossos objetos. A seguir segue uma tabela com as convenes mais utilizadas
para o padro da Linguagem SQL.
Conveno
Letra maiscula
Letra minscula
Exemplo
Comandos: SELECT, WHERE, AND, OR,
ORDER BY, HAVING, CREATE, ALTER,
INSERT, UPDATE, DELETE, etc.
Nome de tabelas e colunas, nome de funes,
etc.
Exemplo:
3. Criar um Schema
Um schema uma coleo de objetos. Os objetos do schema so as
estruturas lgicas que consultam diretamente aos dados em uma base de
dados. Os objetos de um schema incluem tabelas, views, sinnimos,
procedures, etc.
Exemplo:
CREATE SCHEMA sui;
Exemplo:
4. Tipos de Dados
Na tabela abaixo relacionaremos alguns tipos de Dados utilizados pelo Postgre:
Tamanho de armazenamento
2 bytes
4 bytes
8 bytes
varivel
varivel
4 bytes
8 bytes
4 bytes
8 bytes
10
Nome do tipo
character varying(n), varchar(n)
character(n), char(n)
text
Descrio
comprimento varivel com limite
comprimento fixo, completado com brancos
comprimento varivel no limitado
11
Tipo
timestamp [
(p)
]
[
without
time zone ]
timestamp [
(p) ] with
time zone
interval
[
(p) ]
date
time [ (p) ] [
without
time zone ]
time [ (p) ]
with
time
zone
Mais tarde
tanto data
quanto
8 bytes
hora
1
1465001 DC microssegundo /
14 dgitos
tanto data
quanto
hora
intervalos
de tempo
somente
datas
somente a
hora
do
dia
somente a
hora
do
dia
4713 AC
Resoluo
8 bytes
4713 BC
12 bytes
-178000000
anos
1
AD 1465001 microssegundo /
14 dgitos
178000000 1
anos
microssegundo
4 bytes
4713 AC
32767 DC
1 dia
8 bytes
00:00:00.00
23:59:59.99
1
microssegundo
12 bytes
00:00:00.00+12
23:59:59.99- 1
12
microssegundo
12
FALSE
'f'
'false'
'n'
'no'
'0'
13
5.1.
Regras de Nomeao
5.2.
5.3.
14
Exemplo:
CREATE TABLE tsuitipoorgaocolegiado
(
numtipoorgaocol
INTEGER NOT NULL,
strtipoorgaocol
VARCHAR(200) NOT NULL
);
Uma restrio de no-nulo sempre escrita como restrio de coluna.
15
Tambm possvel atribuir nomes s restries de unicidade:
CREATE TABLE tsuitipoorgaocolegiado
( numtipoorgaocol
INTEGER NOT NULL,
strtipoorgaocol
VARCHAR(200) NOT NULL
CONSTRAINT uk_strtipoorgaocol UNIQUE,
);
16
Somente uma chave primria pode ser especificada para uma tabela, seja
como uma restrio de coluna ou como uma restrio de tabela.
A restrio de chave primria deve abranger um conjunto de colunas que seja
diferente de outro conjunto de colunas abrangido por uma restrio de
unicidade definida para a mesma tabela.
A teoria de banco de dados relacional determina que toda tabela deve ter uma
chave primria.
Exemplo:
CREATE TABLE tsuitipoorgaocolegiado
(
numtipoorgaocol
INTEGER NOT NULL PRIMARY KEY,
strtipoorgaocol
VARCHAR(200) NOT NULL
);
Voc poder criar uma chave primria com duas ou mais colunas:
CREATE TABLE exemplo (
a integer,
b integer,
c integer,
PRIMARY KEY (a, c)
);
17
CREATE TABLE tsuiorgaocolegiado
( numorgaocol INTEGER NOT NULL,
tipoorgaocoleg_numtipoorg INTEGER NOT NULL REFERENCES
tsuitipoorgaocolegiado (numtipoorgaocol),
strnomeorgaocol VARCHAR(100) NOT NULL,
datativorgaocol DATE NOT NULL,
strsiglaorgaocol VARCHAR(10) ,
datdesativorgaocol DATE
strfunlegalorgaocol VARCHAR(200),
strstatus CHAR(1) NOT NULL
);
Isto torna impossvel criar rgaos Colegiados com ocorrncias de
tipoorgaocoleg_numtipoorg que no existam na tabela Tipo de rgo
Colegiado.
Nesta situao dito que a tabela rgaos Colegiados a tabela que faz
referncia, e a tabela Tipo de rgo Colegiado a tabela referenciada. Da
mesma forma existem colunas fazendo referncia e sendo referenciadas.
O comando acima pode ser abreviado escrevendo-se:
CREATE TABLE tsuiorgaocolegiado
( numorgaocol INTEGER NOT NULL,
tipoorgaocoleg_numtipoorg INTEGER NOT NULL
REFERENCES tsuitipoorgaocolegiado,
strnomeorgaocol VARCHAR(100) NOT NULL,
datativorgaocol DATE NOT NULL,
strsiglaorgaocol VARCHAR(10) ,
datdesativorgaocol DATE
strfunlegalorgaocol VARCHAR(200),
strstatus CHAR(1) NOT NULL
);
Na ausncia da lista de colunas, a chave primria da tabela referenciada
assumida como sendo a coluna referenciada.
Obviamente, o nmero e o tipo das colunas na restrio precisam corresponder
ao nmero e tipo das colunas referenciadas.
18
tsuitipoorgaocolegiado
ADD
COLUMN
chrtipo
19
ALTER TABLE tsuitipoorgaocolegiado
ADD CONSTRAINT uk_strtipoorgaocol UNIQUE (strtipoorgaocol);
ALTER TABLE tsuiorgaocolegiado
ADD FOREIGN KEY (tipoorgaocoleg_numtipoorg)
REFERENCES tsuitipoograocolegiado;
Para adicionar uma restrio de no nulo, que no pode ser escrita na forma
de restrio de tabela, deve ser utilizada a sintaxe:
ALTER TABLE tsuitipoorgaocolegiado
ALTER COLUMN chrtipo SET NOT NULL;
A restrio ser verificada imediatamente, portanto os dados da tabela devem
satisfazer a restrio antes desta ser criada.
20
21
22
23
24
A clusula ORDER BY especifica a ordenao:
SELECT lista_seleo
FROM expresso_tabela
ORDER BY coluna1 [ASC | DESC] [, coluna2 [ASC | DESC] ...]
onde coluna1, etc. fazem referncia s colunas da lista de seleo. Pode ser
tanto o nome de sada de uma coluna quanto o nmero da coluna.
Alguns exemplos:
SELECT a, b FROM tabela1 ORDER BY a;
SELECT a + b AS soma, c FROM tabela1 ORDER BY soma;
SELECT a, sum(b) FROM tabela1 GROUP BY a ORDER BY 1;
Como uma extenso do padro SQL, o PostgreSQL tambm permite a
ordenao por expresses arbitrrias:
SELECT a, b FROM tabela1 ORDER BY a + b;
Tambm permitido fazer referncia a nomes de colunas da clusula FROM
que foram renomeados na lista de seleo:
SELECT chrtipo AS tipo
FROM tsuitipoorgaocolegiado
ORDER BY tipo;
Mas estas extenses no funcionam nas consultas que envolvem UNION,
INTERSECT ou EXCEPT, e no so portveis para outros bancos de dados
SQL.
Cada coluna especificada pode ser seguida pela palavra opcional ASC ou
DESC, para determinar a forma de ordenao como ascendente ou
descendente. A forma ASC o padro. A ordenao ascendente coloca os
valores menores na frente, sendo que "menor" definido nos termos do
operador <. De forma semelhante, a ordenao descendente determinada
pelo operador >.
Se mais de uma coluna de ordenao for especificada, as ltimas colunas so
utilizadas para ordenar as linhas iguais na ordem imposta pelas primeiras
colunas ordenadas.
25
O SQL utiliza a lgica booleana de trs valores, onde o valor nulo representa o
"desconhecido". Observe as seguintes tabelas verdade:
a
a AND b a OR b
TRUE
TRUE
NULL
NOT a
TRUE FALSE
FALSE TRUE
NULL NULL
menor que
>
maior que
<=
>=
igual
<> ou != diferente
26
Os operadores de comparao esto disponveis em todos os tipos de dado
onde fazem sentido. Todos os operadores de comparao so operadores
binrios que retornam valores do tipo boolean; expresses como 1 < 2 < 3 no
so vlidas (porque no existe o operador < para comparar um valor booleano
com 3).
Alm dos operadores de comparao, a construo especial BETWEEN est
disponvel.
a BETWEEN x AND y
equivale a
a >= x AND a <= y
Igualmente,
a NOT BETWEEN x AND y
equivale a
a < x OR a > y
No existe diferena entre estas duas formas, alm dos ciclos de CPU
necessrios para reescrever a primeira forma na segunda internamente.
Para verificar se um valor ou no nulo devem ser usadas as construes:
expresso IS NULL
expresso IS NOT NULL
Exemplo Resultado
adio
2+3
subtrao
2-3
-1
multiplicao
2*3
mdulo (resto)
5%4
exponenciao
2.0 ^ 3.0 8
27
Nome Descrio
Exemplo Resultado
|/
raiz quadrada
|/ 25.0
||/
raiz cbica
||/ 27.0
fatorial
5!
120
!!
!! 5
120
valor absoluto
@ -5.0
&
AND binrio
91 & 15 11
OR binrio
32 | 3
35
XOR binrio
17 # 5
20
NOT binrio
~1
-2
<<
1 << 4
16
>>
8 >> 2
Funo
Tipo
retorna Descrio
do
cadeia_de_caracteres ||
cadeia_de_caracteres
text
Exemplo
Concatenao de
'Post' || 'greSQL'
cadeias de caracteres
char_length(cadeia_de_ca
Nmero de caracteres
racteres) ou
integer na cadeia de
char_length('jose')
character_length(cadeia_
caracteres
de_caracteres)
Resultado
PostgreSQ
L
4
lower(cadeia_de_caracter
text
es)
Converte a cadeia de
caracteres em letras lower('TOM')
minsculas
tom
position(caracteres in
cadeia_de_caracteres)
Localizao dos
caracteres
integer
position('om' in
'Thomas')
28
Funo
Tipo
retorna Descrio
do
Exemplo
Resultado
especificados
substring(cadeia_de_cara
text
cteres [from integer] [for
integer])
substring(cadeia_de_cara
text
cteres from expresso)
Extrai a parte da
cadeia de caracteres
correspondente
expresso regular
POSIX
substring('Thomas'
mas
from '...$')
substring(cadeia_de_cara
cteres from expresso for text
escape)
Extrai a parte da
cadeia de caracteres
correspondente
expresso regular
SQL
substring('Thomas'
from '%#"o_a#"_'
oma
for '#')
trim([leading | trailing |
both] [caracteres] from
cadeia_de_caracteres)
Remove da
extremidade
inicial/final/ambas da
cadeia_de_caracteres
trim(both 'x' from
, a cadeia de
'xTomxx')
caracteres mais longa
contendo apenas os
caracteres (espao
por padro)
Tom
Converte a cadeia de
caracteres em letras upper('tom')
maisculas
TOM
text
upper(cadeia_de_caracter
text
es)
ascii(text)
cdigo ASCII do
integer primeiro caractere do ascii('x')
argumento
120
btrim(cadeia_de_caracter
text
es text, trim text)
initcap(text)
Converte a primeira
letra de cada palavra
(separadas por
espao em branco)
em maiscula
text
Comprimento da
length(cadeia_de_caracte
integer
cadeia de caracteres
res)
length('jose')
29
Funo
Tipo
retorna Descrio
do
Exemplo
Resultado
lpad(cadeia_de_caractere
s text, comprimento
text
integer [, preenchimento
text])
Preenche a
cadeia_de_caracteres
at o comprimento
adicionando os
caracteres de
preenchimento
lpad('hi', 5, 'xy')
(espao por padro).
Se a
cadeia_de_caracteres
for mais longa que o
comprimento ento
truncada ( direita).
ltrim(cadeia_de_caractere
text
s text, text text)
Remove do incio da
cadeia de caracteres,
a cadeia de
ltrim('zzzytrim','xyz') trim
caracteres mais longa
contendo apenas
caracteres de trim
replace(cadeia_de_caract
eres text, origem text,
text
destino text)
Substitui todas as
ocorrncias de origem
replace('abcdefabc abXXefabX
na
def', 'cd', 'XX')
Xef
cadeia_de_caracteres
por destino
rpad(cadeia_de_caractere
s text, comprimento
text
integer [, preenchimento
text])
Preenche a
cadeia_de_caracteres
at o comprimento
adicionando os
caracteres de
preenchimento
rpad('hi', 5, 'xy')
(espao por padro).
Se a
cadeia_de_caracteres
for mais longa que o
comprimento esto
truncada.
hixyx
rtrim(cadeia_de_caractere
text
s text, trim text)
Remove do fim da
cadeia de caracteres,
a cadeia de
rtrim('trimxxxx','x')
caracteres mais longa
contendo apenas
caracteres de trim
trim
substr(cadeia_de_caracte
text
res, origem [, contador])
Extrai a substring
especificada (o
mesmo que
substring(cadeia de
xyxhi
substr('alphabet', 3,
ph
2)
30
Funo
Tipo
retorna Descrio
do
Exemplo
Resultado
caracteres from
origem for contador))
translate(cadeia_de_carac
teres text, origem text,
text
destino text)
Todo caractere da
cadeia_de_caracteres
, correspondente a
um caractere do
translate('12345',
conjunto origem,
'14', 'ax')
substitudo pelo
caractere
correspondente do
conjunto destino.
a23x5
31
Funes de formatao
Funo
to_char(timestamp,
text)
Retorna
Descrio
Exemplo
Text
converte
carimbo
de tempo (time to_char(timestamp
stamp) em cadeia 'now','HH12:MI:SS')
de caracteres
converte intervalo
to_char(interval '15h 2m
em
cadeia
de
12s','HH24:MI:SS')
caracteres
to_char(int, text)
Text
converte inteiro em
cadeia
de to_char(125, '999')
caracteres
Text
converte real e
preciso dupla em
to_char(125.8, '999D9')
cadeia
de
caracteres
to_char(numeric,
text)
Text
converte numrico
to_char(numeric '-125.8',
em
cadeia
de
'999D99S')
caracteres
to_date(text, text)
Date
to_timestamp(text,
text)
converte cadeia de
to_timestamp('05
Dec
em
timestamp caracteres
2000', 'DD Mon YYYY')
carimbo de tempo
to_char(double
precision, text)
converte cadeia de
to_number('12,454.8-',
caracteres
em
'99G999D9S')
numrico
Descrio
HH
HH12
HH24
MI
minuto (00-59)
SS
segundo (00-59)
MS
milissegundo (000-999)
US
microssegundo (000000-999999)
SSSS
32
Elemento
Descrio
ou P.M.
am ou a.m. ou pm
indicador de meridiano (minsculas)
ou p.m.
Y,YYY
YYYY
YYY
YY
BC ou B.C. ou AD
indicador de era (maiscula)
ou A.D.
bc ou b.c. ou ad ou
indicador de era (minscula)
a.d.
MONTH
Month
month
MON
Mon
mon
MM
nmero do ms (01-12)
DAY
Day
day
DY
Dy
dy
DDD
DD
dia do ms (01-31)
WW
33
Elemento
Descrio
IW
CC
sculo (2 dgitos)
trimestre
RM
rm
TZ
tz
Exemplo
prefixo FM
sufixo TH
adicionar o
maisculas
sufixo
de
nmero
ordinal
em
sufixo th
adicionar o
minsculas
sufixo
de
nmero
ordinal
em
prefixo FX
sufixo SP
modo de falar
implementado)
(spell
mode)
(ainda
no
DDTH
DDth
DDSP
34
Elemento Descrio
MI
PL
SG
RN
EEEE
Sada
to_char(now(),'Day, DD HH12:MI:SS')
'Tuesday , 06 05:39:18'
' -.10'
to_char(-0.1,'FM9.99')
'-.1'
to_char(0.1,'0.9')
' 0.1'
to_char(12,'9990999.9')
' 0012.0'
to_char(12,'FM9990999.9')
'0012'
to_char(485,'999')
' 485'
to_char(-485,'999')
'-485'
to_char(485,'9 9 9')
' 4 8 5'
to_char(1485,'9,999')
' 1,485'
to_char(1485,'9G999')
' 1 485'
to_char(148.5,'999.999')
' 148.500'
to_char(148.5,'999D999')
' 148,500'
to_char(3148.5,'9G999D999')
' 3 148,500'
to_char(-485,'999S')
'485-'
to_char(-485,'999MI')
'485-'
to_char(485,'999MI')
'485'
to_char(485,'PL999')
'+485'
to_char(485,'SG999')
'+485'
to_char(-485,'SG999')
'-485'
to_char(-485,'9SG99')
'4-85'
to_char(-485,'999PR')
'<485>'
to_char(485,'L999')
'DM 485
to_char(485,'RN')
' CDLXXXV'
to_char(485,'FMRN')
'CDLXXXV'
35
Entrada
Sada
to_char(5.2,'FMRN')
to_char(482,'999th')
' 482nd'
to_char(12,'99V999')
' 12000'
to_char(12.4,'99V999')
' 12400'
to_char(12.45, '99V9')
' 125'
36
37
10.1. Transaes
Transao um conceito fundamental de todo o sistema de banco de dados. O
ponto essencial de uma transao que esta engloba vrios passos em uma
nica operao de tudo ou nada. Os estados dos passos intermedirios no
so visveis para as outras transaes concorrentes e, se alguma falha ocorrer
que impea a transao de chegar at o fim, ento nenhum dos passos
intermedirios ir afetar o banco de dados de nenhuma forma.
No PostgreSQL uma transao definida cercando-se os comandos SQL da
transao com os comandos BEGIN e COMMIT. Sendo assim, a nossa
transao bancria ficaria:
BEGIN;
UPDATE conta_corrente
SET saldo = saldo - 100.00
WHERE nome = Alice;
-- etc etc
COMMIT;
Se no meio da transao for decidido que esta no deve ser concluda (talvez
porque foi visto que o saldo da Alice se tornou negativo), pode ser executado o
comando ROLLBACK em vez do COMMIT, fazendo com que todas as
atualizaes sejam canceladas.
O PostgreSQL na verdade trata todo comando SQL como sendo executado
dentro de uma transao. Se no for utilizado o comando BEGIN, ento cada
comando possui individualmente um BEGIN e um (se der tudo certo) COMMIT
em torno dele. Um grupo de comandos envolvidos por um BEGIN e um
COMMIT algumas vezes chamado de bloco de transao.
38
39
Parte B: Avanado
12. Expresso condicional
12.1.
CASE
40
=> SELECT chrtipo,
CASE WHEN chrtipo = 'C' THEN 'Central'
WHEN chrtipo = 'L' THEN 'Local'
ELSE 'outro'
END AS Tipo
FROM sui.tsuitipoorgaocolegiado;
chrtipo
| Tipo
-----------------+------C
| Central
L
| Local
C
| Central
L
| Local
L
| Local
L
| Local
C
| Central
L
| Local
L
| Local
L
| Local
L
| Local
C
| Central
C
| Central
Os tipos de dado de todas as expresses para resultado devem poder ser
convertidos no mesmo tipo de dado de sada.
CASE expresso
WHEN valor THEN resultado
[WHEN ...]
[ELSE resultado]
END
Esta expresso CASE "simplificada" uma variante especializada da forma
geral mostrada acima. A expresso calculada e comparada com todos os
valores das clusulas WHEN, at ser encontrado um igual. Se nenhum valor
igual for encontrado, o resultado na clusula ELSE (ou o valor nulo)
retornado. Esta forma semelhante declarao switch da linguagem C.
O exemplo mostrado anteriormente pode ser escrito utilizando a sintaxe
simplificada do CASE:
=> SELECT chrtipo,
CASE chrtipo
END AS Tipo
FROM sui.tsuitipoorgaocolegiado;
41
12.2. COALESCE
COALESCE (expressao1, expressao2,
...
expressaon)
12.3. NULLIF
NULLIF(valor1, valor2)
A funo NULLIF retorna o valor nulo se, e somente se, valor1 e valor2 forem
iguais. Seno, retorna valor1. Pode ser utilizado para realizar a operao
inversa do exemplo para COALESCE mostrado acima:
SELECT NULLIF(loc_numlocalidade, 'no definido')
FROM sui.tsuilocalidade
Dica: Tanto o COALESCE como o NULLIF so apenas formas abreviadas das
expresses CASE. Na realidade, so convertidos em expresses CASE em um
estgio bem inicial do processamento, fazendo o processamento subseqente
supor que est lidando com o CASE. Por isso, a utilizao incorreta do
COALESCE ou do NULLIF pode produzir uma mensagem de erro fazendo
referncia ao CASE.
42
43
formado pelos elementos que pertencem a A ou B. Edwaldo Bianchini e
Herval Paccola - Matemtica - Operaes com conjuntos. (N.T.)
Exemplo:
SELECT strnomepaisuf AS Localidade
FROM sui.tsuiuf
WHERE strnomepaisuf LIKE 'BRASIL/S%'
UNION
SELECT strnomelocalidade AS Localidade
FROM sui.tsuilocalidade
WHERE strnomelocalidade LIKE 'S%'
Localidade
--------------------------------------------------------------BRASIL/SANTA CATARINA
BRASIL/SERGIPE
BRASIL/SO PAULO
SABARA
SABAUDIA
SABAUNA
SABIAGUABA
SABINO
SABINOPOLIS
SABOEIRO
...
44
45
Esta consulta chamada de juno externa esquerda (left outer join) porque a
tabela mencionada esquerda do operador de juno ter cada uma de suas
linhas aparecendo na sada ao menos uma vez, enquanto que a tabela direita
vai ter somente as linhas que correspondem a alguma linha da tabela
esquerda aparecendo. Ao listar uma linha da tabela esquerda, para a qual
no existe nenhuma linha correspondente na tabela direita, valores vazios
(null) so colocados nas colunas da tabela direita. Existe tambm a juno
externa direita (right outer join)
46
Exemplo:
SELECT e.numentidade, e.strnomeent, e.ent_numentidade,
f.numentidade, f.strnomeent
FROM sui.tsuientidade e, sui.tsuientidade f
WHERE e.ent_numentidade = f.numentidade
47
15.1. GROUP BY
48
strnomepaisuf
| flgtipopaisuf
-------------------------------------------+--------------------BRASIL/ALAGOAS
B
BRASIL/ACRE
B
BRASIL/AMAP
B
BRASIL/AMAZONAS
B
AFEGANISTAO
E
AFRICA DO SUL
E
ALBANIA
E
ALEMANHA
E
ALTO VOLTA
E
ANDORRA
E
...
(263 rows)
flgtipopaisuf
------------------B
E
(2 rows)
Na segunda consulta no poderia ser escrito SELECT * FROM sui.tsuiuf uf
GROUP BY flgtipopaisuf, porque no existe um nico valor da coluna y que
poderia ser associado com cada grupo. As colunas agrupadas podem ser
referenciadas na lista de seleo, porque possuem um valor constante
conhecido para cada grupo.
De modo geral, se uma tabela agrupada as colunas que no so usadas nos
agrupamentos no podem ser referenciadas, exceto nas expresses de
agregao. Um exemplo de expresso de agregao :
=> SELECT flgtipopaisuf, COUNT(strnomepaisuf)
FROM sui.tsuiuf uf
GROUP BY flgtipopaisuf;
flgtipopaisuf | count
-----------------+--------B
28
E
235
(2 rows)
49
Aqui count() a funo de agregao que calcula a quantidade de registros
para o grupo todo.
Dica: Um agrupamento sem expresso de agregao na verdade computa o
conjunto de linhas distintas de uma coluna. Tambm poderia ser obtido por
meio da clusula DISTINCT.
15.2.
Funes de Agregao
15.3.
A clusula HAVING
50
forma que a clusula WHERE, para remover grupos da tabela agrupada. A
sintaxe :
SELECT lista_seleo
FROM ... [WHERE ...]
GROUP BY ... HAVING expresso_booleana
As expresses na clusula HAVING podem fazer referncia tanto a expresses
agrupadas quanto a expresses no agrupadas (as quais necessariamente
envolvem uma funo de agregao).
Exemplo:
=> SELECT flgtipopaisuf, COUNT(strnomepaisuf)
FROM sui.tsuiuf uf
GROUP BY flgtipopaisuf
HAVING flgtipopaisuf != 'B';
flgtipopaisuf | count
-----------------+--------E
235
(1 row)
=> SELECT flgtipopaisuf, COUNT(strnomepaisuf)
FROM sui.tsuiuf uf
GROUP BY flgtipopaisuf
HAVING flgtipopaisuf < 'E';
flgtipopaisuf | count
-----------------+--------B
28
(1 row)
A clusula WHERE seleciona linhas por uma coluna que no agrupada,
enquanto a clusula HAVING restringe a sada para os grupos.
51
16.1. EXISTS
EXISTS ( subconsulta )
O argumento do EXISTS uma declarao SELECT arbitrria, ou uma
subconsulta. A subconsulta avaliada para determinar se retorna alguma linha.
Se retornar pelo menos uma linha, o resultado de EXISTS "verdade"; se a
subconsulta no retornar nenhuma linha, o resultado de EXISTS "falso".
A subconsulta pode fazer referncia s variveis da consulta que a envolve,
que atuam como constantes durante a avaliao da subconsulta.
A subconsulta geralmente s executada at ser determinado se pelo menos
uma linha retornada, e no at o fim. No sensato escrever uma
subconsulta que tenha efeitos colaterais (tal como chamar uma funo de
seqncia); se o efeito colateral ocorrer ou no pode ser difcil de saber.
Uma vez que o resultado depende apenas do fato de alguma linha ser
retornada, e no do contedo desta linha, normalmente no h interesse no
contedo da sada da subconsulta. Uma conveno usual de codificao,
escrever todos os testes de EXISTS na forma EXISTS(SELECT 1 WHERE ...).
Entretanto, existem excees para esta regra, como as subconsultas que
utilizam INTERSECT.
SELECT * FROM sui.tsuiprograma
WHERE EXISTS (SELECT 1 FROM sui.tsuicursog);
52
16.2.
IN
expresso IN (subconsulta)
O lado direito desta forma do IN uma subconsulta entre parnteses, que deve
retornar exatamente uma coluna. A expresso esquerda avaliada e
comparada com cada linha do resultado da subconsulta. O resultado do IN
"verdade" se uma linha igual for encontrada no resultado da subconsulta. O
resultado "falso" se nenhuma linha igual for encontrada (incluindo o caso
especial onde a subconsulta no retorna nenhuma linha).
Quando a expresso esquerda for nula, ou no havendo nenhum valor igual
direita, e pelo menos uma das linhas direita for nula, o resultado da
construo IN ser nulo, e no falso. Isto est de acordo com as regras
normais do SQL para as combinaes booleanas de valores nulos.
Da mesma forma que em EXISTS, no sensato supor que a subconsulta ser
executada at o fim.
(expresso [, expresso ...]) IN (subconsulta)
O lado direito desta forma do IN uma subconsulta entre parnteses, que deve
retornar tantas colunas quantas forem as expresses existentes na lista do lado
esquerdo. As expresses do lado esquerdo so avaliadas e comparadas com
cada linha do resultado da subconsulta. O resultado do IN "verdade" se for
encontrada alguma linha igual na subconsulta. O resultado "falso" se
nenhuma linha igual for encontrada (incluindo o caso especial onde a
subconsulta no retorna nenhuma linha).
Como usual, os valores nulos nas expresses ou nas linhas da subconsulta
so combinados conforme as regras normais do SQL para expresses
booleanas. Duas linhas so consideradas iguais se todos os membros
correspondentes forem iguais e no nulos; as linhas no so iguais se algum
membro correspondente for diferente e no nulo; caso contrrio, o resultado da
comparao da linha desconhecido (nulo). Se os resultados de todas as
linhas forem diferentes ou nulos, com pelo menos um nulo, ento o resultado
do IN nulo.
Exemplo:
SELECT * FROM sui.tsuitipoorgaocolegiado t
WHERE t.numtipoorgaocol IN
(SELECT tipoorgaocoleg_numtipoorgaocol
FROM sui.tsuiorgaocolegiado c, sui.tsuiprograma p
WHERE c.prg_numprogramap = p.numprogramap
AND c.prg_numentidade = p.ent_numentidade);
53
16.3. NOT IN
expresso NOT IN (subconsulta)
O lado direito desta forma do NOT IN uma subconsulta entre parnteses,
que deve retornar exatamente uma coluna. A expresso do lado esquerdo
avaliada e comparada com cada linha do resultado da subconsulta. O resultado
do NOT IN "verdade" se somente linhas diferentes forem encontradas no
resultado da subconsulta (incluindo o caso especial onde a subconsulta no
retorna nenhuma linha). O resultado "falso" se qualquer linha igual for
encontrada.
Quando a expresso esquerda for nula, ou no havendo nenhum valor igual
direita, e pelo menos uma linha da direita for nula, o resultado da construo
NOT IN ser nulo, e no verdade. Isto est de acordo com as regras normais
do SQL para as combinaes booleanas de valores nulos.
Do mesmo modo que no EXISTS, no sensato supor que a subconsulta ser
executada at o fim.
(expresso [, expresso ...]) NOT IN (subconsulta)
O lado direito desta forma do NOT IN uma subconsulta entre parnteses,
que deve retornar tantas colunas quantas forem as expresses existentes na
lista do lado esquerdo. As expresses do lado esquerdo so avaliadas e
comparadas com cada linha do resultado da subconsulta. O resultado do NOT
IN "verdade" se somente linhas diferentes forem encontradas na subconsulta
(incluindo o caso especial onde a subconsulta no retorna nenhuma linha. O
resultado falso se uma linha igual for encontrada).
Como usual, os valores nulos nas expresses ou nas linhas da subconsulta
so combinados conforme as regras normais do SQL para expresses
booleanas. Duas linhas so consideradas iguais se todos os membros
correspondentes forem iguais e no nulos; as linhas no so iguais se algum
membro correspondente for diferente e no nulo; caso contrrio, o resultado da
comparao da linha desconhecido (nulo). Se todos os resultados das linhas
forem diferentes ou nulos, com pelo menos um nulo, ento o resultado de NOT
IN nulo.
Exemplo:
SELECT * FROM sui.tsuitipoorgaocolegiado t
WHERE t.numtipoorgaocol NOT IN
(SELECT tipoorgaocoleg_numtipoorgaocol
FROM sui.tsuiorgaocolegiado c, sui.tsuiprograma p
WHERE c.prg_numprogramap = p.numprogramap
AND c.prg_numentidade = p.ent_numentidade)
54
55
Exerccios
1) Criar uma tabela no Schema SUI com os dados abaixo:
Nome lgico: Funo / Tipo no colegiado
Descrio: Permite armazenar as funes possveis que um MCA
(Membro da Comunidade Acadmica) pode assumir num colegiado.
Exemplos: Presidente, Representante da FAPESP Titular,
Representante Docente Suplente, etc.
Nome da Tabela: TSUIFUNCAO_TPORGAOCOL
Nome
Atributo
do Significado
numFuncaoCol
toc_numtipoOrgaoCol
funcoleg_numFuncaoCol
chrunico
Tipo
Tamanho Obrigatrio
X
X
X
1
do Significado
Quantidade
Tipo
integer
Req
X
56
1
Cdigo do Coordenador
Cdigo de CONSELHOS DE PROGRAMAS DE POS
GRADUAO
numFuncaoCol
toc_numtipoOrgaoCol
Funcoleg_numFuncaoCol
2
Cdigo do Coordenador
Cdigo de REPRESENTANTE DISCENTE DA POS
GRADUAAO
57
58
- T = Campus Complexo
- R = Unidades Complementares