Professional Documents
Culture Documents
Apostila sobre o
Banco de Dados Postgre
Ano 2005
2
Introduo .......................................................................................................... 5
Parte A: Bsico................................................................................................... 6
10.1. Transaes..................................................................................... 37
12.1. CASE.............................................................................................. 39
16.1. EXISTS........................................................................................... 51
16.2. IN.................................................................................................... 52
Introduo
O PostgreSQL um sistema de gerenciamento de banco de dados objeto-
relacional (SGBDOR) , ele foi o pioneiro em muitos conceitos objeto-relationais
que agora esto se tornando disponveis em alguns bancos de dados
comerciais.
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).
6
Parte A: Bsico
Conveno Exemplo
Letra maiscula Comandos: SELECT, WHERE, AND, OR,
ORDER BY, HAVING, CREATE, ALTER,
INSERT, UPDATE, DELETE, etc.
Letra minscula Nome de tabelas e colunas, nome de funes,
etc.
7
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:
Exemplo:
4. Tipos de Dados
Na tabela abaixo relacionaremos alguns tipos de Dados utilizados pelo Postgre:
O tipo integer a escolha usual, porque oferece o melhor equilbrio entre faixa
de valores, tamanho de armazenamento e desempenho. Geralmente o tipo
smallint s utilizado quando o espao em disco est muito escasso. O tipo
bigint somente deve ser usado quando a faixa de valores de integer no for
suficiente, porque este ltimo bem mais rpido.
O padro SQL somente especifica os tipos inteiros integer (ou int) e smallint. O
tipo bigint, e os nomes de tipo int2, int4 e int8 so extenses, tambm
compartilhadas por vrios outros sistemas de banco de dados SQL.
Alm desses, o PostgreSQL suporta o tipo mais geral text, que armazena
cadeias de caracteres de qualquer comprimento. Diferentemente de character
varying, text no requer um limite superior explicitamente declarado de seu
tamanho. Embora o tipo text no esteja no padro SQL, muitos outros RDBMS
tambm o incluem.
11
TRUE
't'
'true'
'y'
'yes'
'1'
FALSE
'f'
'false'
'n'
'no'
'0'
OBS: Existem outros tipos de dados que no ser possvel relatar nesta
apostila, voc pode consultar o Guia do Usurio do PostgreSQL 7.3.4.
13
Para criar uma tabela utilizado o comando CREATE TABLE, prprio para
esta tarefa. Neste comando so especificados ao menos o nome da nova
tabela, os nomes das colunas, e os tipos de dado de cada coluna.
Exemplo:
Exemplo:
Uma coluna pode possuir um valor padro. Quando uma nova linha criada, e
nenhum valor especificado para algumas colunas, o valor padro de cada
uma destas colunas atribudo mesma.
Exemplo:
Tambm pode ser atribudo um nome individual para a restrio. Isto torna
mais clara a mensagem de erro, e permite fazer referncia restrio quando
for desejado alter-la. A sintaxe :
A chave primria indica que a coluna, ou grupo de colunas pode ser utilizado
como identificador nico para as linhas da tabela.
16
Somente uma chave primria pode ser especificada para uma tabela, seja
como uma restrio de coluna ou como uma restrio de tabela.
A teoria de banco de dados relacional determina que toda tabela deve ter uma
chave primria.
Exemplo:
Voc poder criar uma chave primria com duas ou mais colunas:
Agora vamos supor, tambm, que existe uma tabela armazenando os rgos
Colegiados destes Tipos de rgos Colegiados, e desejamos garantir que a
tabela de rgos Colegiados somente contenha tipos de rgo de colegiado
que realmente existem. Para isso definida uma restrio de chave estrangeira
na tabela rgo Colegiado, fazendo referncia tabela Tipo de rgo
Colegiado.
Exemplo:
17
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.
Incluir coluna;
Excluir coluna;
Incluir restrio;
Excluir restrio;
Por exemplo:
19
Para adicionar uma restrio de no nulo, que no pode ser escrita na forma
de restrio de tabela, deve ser utilizada a sintaxe:
Para excluir uma restrio necessrio conhecer seu nome. Quando o usurio
atribuiu um nome restrio fcil, caso contrrio o sistema atribui para a
restrio um nome gerado que precisa ser descoberto. O comando \d
nome_da_tabela do psql pode ser til nesta situao; outras interfaces tambm
podem oferecer um modo de inspecionar os detalhes das tabelas. O comando
a ser utilizado para excluir a restrio :
Esta sintaxe serve para todos os tipos de restrio exceto no-nulo. Para
excluir uma restrio de no-nulo deve ser utilizado o comando:
Para criar uma nova linha deve ser utilizado o comando INSERT.
SELECT lista_seleo
FROM expresso_tabela [especificao_ordenao]
WHERE condio_pesquisa
Aps a consulta ter produzido uma tabela de sada (aps a lista de seleo ter
sido processada) esta tabela pode, opcionalmente, ser ordenada. Se nenhuma
ordenao for especificada, as linhas retornam em uma ordem aleatria. Na
verdade, neste caso a ordem depende dos tipos de plano de varredura e de
juno e da ordem no disco, mas no se deve confiar nisto. Uma determinada
ordem de sada somente pode ser garantida se a etapa de ordenao for
explicitamente especificada.
24
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:
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 >.
AND
OR
NOT
25
O SQL utiliza a lgica booleana de trs valores, onde o valor nulo representa o
"desconhecido". Observe as seguintes tabelas verdade:
a b a AND b a OR b
TRUE TRUE TRUE TRUE
TRUE FALSE FALSE TRUE
TRUE NULL NULL TRUE
FALSE FALSE FALSE FALSE
FALSE NULL FALSE NULL
NULL NULL NULL NULL
a NOT a
TRUE FALSE
FALSE TRUE
NULL NULL
Exemplo:
SELECT *
FROM tsuitipoorgaocolegiado
WHERE chrtipo = L
AND numtipoorgaocol > 5;
Operador Descrio
< menor que
> maior que
<= menor que ou igual a
>= maior que ou igual a
= igual
<> ou != diferente
26
a BETWEEN x AND y
equivale a
Igualmente,
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.
expresso IS NULL
Tipo
Funo retorna Descrio Exemplo Resultado
do
cadeia_de_caracteres || Concatenao de PostgreSQ
text 'Post' || 'greSQL'
cadeia_de_caracteres cadeias de caracteres L
char_length(cadeia_de_ca
Nmero de caracteres
racteres) ou
integer na cadeia de char_length('jose') 4
character_length(cadeia_
caracteres
de_caracteres)
Converte a cadeia de
lower(cadeia_de_caracter
text caracteres em letras lower('TOM') tom
es)
minsculas
position(caracteres in Localizao dos position('om' in
integer 3
cadeia_de_caracteres) caracteres 'Thomas')
28
Tipo
Funo retorna Descrio Exemplo Resultado
do
especificados
substring(cadeia_de_cara
Extrai parte da cadeia substring('Thomas'
cteres [from integer] [for text hom
de caracteres from 2 for 3)
integer])
Extrai a parte da
cadeia de caracteres
substring(cadeia_de_cara substring('Thomas'
text correspondente mas
cteres from expresso) from '...$')
expresso regular
POSIX
Extrai a parte da
substring(cadeia_de_cara cadeia de caracteres substring('Thomas'
cteres from expresso for text correspondente from '%#"o_a#"_' oma
escape) expresso regular for '#')
SQL
Remove da
extremidade
inicial/final/ambas da
trim([leading | trailing | cadeia_de_caracteres
trim(both 'x' from
both] [caracteres] from text , a cadeia de Tom
'xTomxx')
cadeia_de_caracteres) caracteres mais longa
contendo apenas os
caracteres (espao
por padro)
Converte a cadeia de
upper(cadeia_de_caracter
text caracteres em letras upper('tom') TOM
es)
maisculas
cdigo ASCII do
ascii(text) integer primeiro caractere do ascii('x') 120
argumento
Remove (trim) a maior
cadeia de caracteres
composta apenas
btrim(cadeia_de_caracter btrim('xyxtrimyyx','x
text pelos caracteres trim
es text, trim text) y')
contidos em trim, do
incio e do fim da
cadeia_de_caracteres
Converte a primeira
letra de cada palavra
initcap(text) text (separadas por initcap('hi thomas') Hi Thomas
espao em branco)
em maiscula
length(cadeia_de_caracte Comprimento da
integer length('jose') 4
res) cadeia de caracteres
29
Tipo
Funo retorna Descrio Exemplo Resultado
do
Preenche a
cadeia_de_caracteres
at o comprimento
adicionando os
lpad(cadeia_de_caractere caracteres de
s text, comprimento preenchimento
text lpad('hi', 5, 'xy') xyxhi
integer [, preenchimento (espao por padro).
text]) Se a
cadeia_de_caracteres
for mais longa que o
comprimento ento
truncada ( direita).
Remove do incio da
cadeia de caracteres,
ltrim(cadeia_de_caractere a cadeia de
text ltrim('zzzytrim','xyz') trim
s text, text text) caracteres mais longa
contendo apenas
caracteres de trim
Substitui todas as
replace(cadeia_de_caract ocorrncias de origem
replace('abcdefabc abXXefabX
eres text, origem text, text na
def', 'cd', 'XX') Xef
destino text) cadeia_de_caracteres
por destino
Preenche a
cadeia_de_caracteres
at o comprimento
adicionando os
rpad(cadeia_de_caractere caracteres de
s text, comprimento preenchimento
text rpad('hi', 5, 'xy') hixyx
integer [, preenchimento (espao por padro).
text]) Se a
cadeia_de_caracteres
for mais longa que o
comprimento esto
truncada.
Remove do fim da
cadeia de caracteres,
rtrim(cadeia_de_caractere a cadeia de
text rtrim('trimxxxx','x') trim
s text, trim text) caracteres mais longa
contendo apenas
caracteres de trim
Extrai a substring
substr(cadeia_de_caracte especificada (o substr('alphabet', 3,
text ph
res, origem [, contador]) mesmo que 2)
substring(cadeia de
30
Tipo
Funo retorna Descrio Exemplo Resultado
do
caracteres from
origem for contador))
Todo caractere da
cadeia_de_caracteres
, correspondente a
translate(cadeia_de_carac um caractere do
translate('12345',
teres text, origem text, text conjunto origem, a23x5
'14', 'ax')
destino text) substitudo pelo
caractere
correspondente do
conjunto destino.
Use a condio LIKE para executar buscas de valores vlidos de uma string.
Exemplos:
SELECT strtipoorgaocol
FROM tsuitipoorgaocolegiado
WHERE strtipoorgaocol LIKE 'CON%;
SELECT strtipoorgaocol
FROM tsuitipoorgaocolegiado
WHERE strtipoorgaocol LIKE _O%;
Funes de formatao
Elemento Descrio
HH hora do dia (01-12)
HH12 hora do dia (01-12)
HH24 hora do dia (00-23)
MI minuto (00-59)
SS segundo (00-59)
MS milissegundo (000-999)
US microssegundo (000000-999999)
SSSS segundos aps a meia-noite (0-86399)
AM ou A.M. ou PM indicador de meridiano (maisculas)
32
Elemento Descrio
ou P.M.
am ou a.m. ou pm
indicador de meridiano (minsculas)
ou p.m.
Y,YYY ano (4 e mais dgitos) com vrgula
YYYY ano (4 e mais dgitos)
YYY ltimos 3 dgitos do ano
YY ltimos 2 dgitos do ano
Y ltimo dgito do ano
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.
nome completo do ms em maisculas (9 caracteres
MONTH
completado com espaos)
nome completo do ms em maisculas e minsculas (9
Month
caracteres completado com espaos)
nome completo do ms em minsculas (9 caracteres
month
completado com espaos)
MON nome abreviado do ms em maisculas (3 caracteres)
nome abreviado do ms em maisculas e minsculas (3
Mon
caracteres)
mon nome abreviado do ms em minsculas (3 caracteres)
MM nmero do ms (01-12)
nome completo do dia em maisculas (9 caracteres
DAY
completado com espaos)
nome completo do dia em maisculas e minsculas (9
Day
caracteres completado com espaos)
nome completo do dia em minsculas (9 caracteres
day
completado com espaos)
DY nome abreviado do dia em maisculas (3 caracteres)
nome abreviado do dia em maisculas e minsculas (3
Dy
caracteres)
dy nome abreviado do dia em minsculas (3 caracteres)
DDD dia do ano (001-366)
DD dia do ms (01-31)
D dia da semana (1-7; SUN=1)
semana do ms (1-5) onde a primeira semana comea no
W
primeiro dia do ms
nmero da semana do ano (1-53) onde a primeira semana
WW
comea no primeiro dia do ano
33
Elemento Descrio
nmero da semana do ano ISO (A primeira quinta-feira do
IW
novo ano est na semana 1)
CC sculo (2 dgitos)
J Dia Juliano (dias desde 1 de janeiro de 4712 AC)
Q trimestre
RM ms em algarismos romanos (I-XII; I=Janeiro) - maisculas
rm ms em algarismos romanos (I-XII; I=Janeiro) - minsculas
TZ zona horria - maisculas
tz zona horria - minsculas
Elemento Descrio
9 valor com o nmero especificado de dgitos
0 valor com zeros esquerda
. (ponto) ponto decimal
, (vrgula) separador de grupo (milhares)
PR valor negativo entre chaves
S valor negativo com o sinal de menos (utiliza a localizao)
L smbolo da moeda (utiliza a localizao)
D ponto decimal (utiliza a localizao)
G separador de grupo (utiliza a localizao)
34
Elemento Descrio
MI sinal de menos na posio especificada (se nmero < 0)
PL sinal de mais na posio especificada (se nmero > 0)
SG sinal de mais/menos na posio especificada
RN algarismos romanos (entrada entre 1 e 3999)
TH ou th converte em nmero ordinal
V desloca n dgitos (veja as notas)
EEEE notao cientfica (ainda no implementada)
Entrada Sada
to_char(now(),'Day, DD HH12:MI:SS') 'Tuesday , 06 05:39:18'
to_char(now(),'FMDay, FMDD HH12:MI:SS') 'Tuesday, 6 05:39:18'
to_char(-0.1,'99.99') ' -.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') V
to_char(482,'999th') ' 482nd'
to_char(485, '"Good number:"999') 'Good number: 485'
to_char(485.8,'"Pre:"999" Post:" .999') 'Pre: 485 Post: .800'
to_char(12,'99V999') ' 12000'
to_char(12.4,'99V999') ' 12400'
to_char(12.45, '99V9') ' 125'
36
UPDATE tsuitipoorgaocolegiado
SET chrtipo = L
WHERE numtipoorgaocol = 1;
Tambm pode ser atualizada mais de uma coluna pelo comando UPDATE,
colocando mais de uma atribuio na clusula SET. Por exemplo:
UPDATE tsuitipoorgaocolegiado
SET strtipoorgaocol = ORGOS COLEGIADOS DA ADMINISTRAO
CENTRAL, chrtipo = L
WHERE numtipoorgaocol = 1;
37
10.1. Transaes
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.
Parte B: Avanado
12.1. CASE
CASE WHEN condio THEN resultado
[WHEN ...]
[ELSE resultado]
END
Um exemplo:
chrtipo
----------
C
L
C
L
L
L
C
L
L
L
L
C
C
40
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
CASE expresso
WHEN valor THEN resultado
[WHEN ...]
[ELSE resultado]
END
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:
onde consulta1 e consulta2 so consultas que podem utilizar qualquer uma das
funcionalidades discutidas anteriormente. As operaes com conjuntos tambm
podem ser aninhadas ou encadeadas.
significa, na verdade,
Notas
Exemplo:
Localidade
---------------------------------------------------------------
BRASIL/SANTA CATARINA
BRASIL/SERGIPE
BRASIL/SO PAULO
SABARA
SABAUDIA
SABAUNA
SABIAGUABA
SABINO
SABINOPOLIS
SABOEIRO
...
44
SELECT *
FROM sui.tsuientidade, sui.tsuiua
WHERE numentidade = ent_numentidade
AND strnomeent LIKE 'FACULDADE%';
SELECT *
FROM sui.tsuientidade INNER JOIN sui.tsuiua ON
(tsuientidade.numentidade = tsuiua.ent_numentidade);
Se nenhuma linha for encontrada, ns queremos que algum valor vazio seja
colocado nas colunas da tabela TSUIPROGRAMA. Este tipo de consulta
chamado de juno externa (outer join).
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)
Traz todas as linhas da tabela direita mesmo que no tenha na tabela do lado
esquerdo, e tambm traz todas as linhas da tabela esquerda mesmo que no
tenha na tabela do lado direito.
Exemplo:
Exemplo:
SELECT lista_seleo
FROM ...
[WHERE ...]
GROUP BY referncia_coluna_agrupamento [,
referncia_coluna_agrupamento]...
15.1. GROUP BY
Por exemplo:
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)
flgtipopaisuf | count
-----------------+---------
B 28
E 235
(2 rows)
49
As funes so:
Exemplo:
HAVING especifica uma tabela agrupada derivada pela eliminao das linhas
agrupadas que no satisfazem a expresso_booleana. HAVING diferente de
WHERE: WHERE filtra individualmente as linhas antes da aplicao do
GROUP BY, enquanto HAVING filtra os grupos de linhas criados pelo GROUP
BY.
Se uma tabela for agrupada utilizando a clusula GROUP BY, mas h interesse
em alguns grupos apenas, a clusula HAVING pode ser utilizada, da mesma
50
SELECT lista_seleo
FROM ... [WHERE ...]
GROUP BY ... HAVING expresso_booleana
Exemplo:
flgtipopaisuf | count
-----------------+---------
E 235
(1 row)
flgtipopaisuf | count
-----------------+---------
B 28
(1 row)
WHERE
HAVING
FROM
16.1. EXISTS
EXISTS ( subconsulta )
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.
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).
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).
Exemplo:
16.3. NOT IN
expresso NOT IN (subconsulta)
Exemplo:
Exemplo:
Consultando a viso:
Exerccios
numFuncaoCol 1
toc_numtipoOrgaoCol Cdigo do Coordenador
funcoleg_numFuncaoCol Cdigo de CONSELHOS DE PROGRAMAS DE POS
GRADUAO
numFuncaoCol 2
toc_numtipoOrgaoCol Cdigo do Coordenador
Funcoleg_numFuncaoCol Cdigo de REPRESENTANTE DISCENTE DA POS
GRADUAAO
a) Crie uma consulta que retorne todos MCAs que possuam o nome
(strnomemca) com as iniciais ADA
b) Crie uma nova consulta nesta mesma tabela que retorne todos os
MCAs que possuam em seu nome completo (strnomemca) a
palavra SILVA
c) Crie uma nova consulta nesta mesma tabela que retorne todos os
MCAs que possuam a 3 letra A em seu nome (strnomemca).
- C = Campus Universitrio
58
- T = Campus Complexo
- R = Unidades Complementares
19) Fazer uma view que contenha os dados dos Cursos de Graduao em
suas respectivas Entidades, fazer da seguinte forma: