2. Modelo Relacional

 

O Modelo relacional estabeleceu-se como o primeiro modelo de dados para aplicações comerciais. Os primeiros sistemas de banco de dados tiveram por base ou o modelo rede ou o modelo hierárquico.

 

2.1. Estrutura dos Bancos de Dados Relacionais

 

Um banco de dados relacional consiste em uma coleção de tabelas, cada uma das quais com um nome único. Uma linha em uma tabela representa um relacionamento entre um conjunto de valores. Uma vez que essa tabela é uma coleção  de tais relacionamentos, há uma estreita correspondência entre o conceito de tabela e o conceito matemático de relação, a partir das quais se origina o nome desse modelo de dados.

 

2.1.1. Estrutura Básica

 

Considere a tabela Conta, mostrada abaixo. Ela possui três colunas: Nome_ Agência, numero e saldo. Seguindo a terminologia do modelo relacional, tratamos os nomes dessas colunas como atributos. Para cada atributo, há um conjunto de valores permitidos, chamado domínio do atributo em questão. Para o atributo Nome_Agencia, por exemplo, o domínio é o conjunto de todos os nomes de agências. Suponha que D1 denote esse conjunto, D2 denota o conjunto de todos os números de contas e D3, o conjunto de todos os saldos. Qualquer linha da tabela Conta consiste necessariamente de uma 3-tupla (v1, v2, v3), em que v1 é o nome de uma agência (isto é, v1 está no domínio D1), v2 é um número de conta e assim por diante. Em geral, a conta é um conjunto de D1 x D2 x D3.

 

Matematicamente, define-se uma relação como um subconjunto de um produto cartesiano de uma lista de domínios. Essa definição corresponde quase exatamente à definição de uma tabela. A única diferença é que designamos nomes aos atributos, ao passo que, matematicamente se usam apenas "nomes" numéricos. Como as tabelas em essência são relações, podemos usar os termos matemáticos relação e tupla no lugar de tabela e linhas.

 

Nome_ Agência

numero

Saldo

Centro

900

62

Praia do Canto

556

6589

Bento Ferreira

647

3245

Jucutuquara

801

2258

Figura 2.1: A Relação Conta

 

É possível, para alguns atributos, possuir o mesmo domínio. Por exemplo, suponha que tenhamos a relação cliente, possuindo três atributos: nome_cliente, rua_cliente e cidade; e a relação empregado, que inclui o atributo nome_empregado. É possível que os atributos nome_cliente e nome_empregado possuam os mesmos domínios: o conjunto formado pelos nomes de pessoas. Os domínios de saldo e nome_agencia certamente são distintos. Entretanto, talvez não esteja tão claro o fato de nome_cliente e nome_agência não possuírem o mesmo domínio. No nível físico, ambos os nomes, de agência e cliente, são compostos por sequências de caracteres. Entretanto, no nível lógico, podemos considerar os domínios de nome_cliente e nome_agência distintos.

 

Um valor de domínio que pertence a qualquer domínio possível é o valor nulo, que indica que um valor é desconhecido ou não existe. Por exemplo, supomos que incluamos o atributo numero_telefone na relação cliente. Pode ser que um cliente não possua telefone ou mesmo o seu número pode ser desconhecido.

 

 

2.1.2. Chaves

 

Vamos agora relembrar os conceitos de chaves vistos na disciplina de Análise de Sistemas.

 

É importante especificar como as entidades dentro de um dado conjunto de entidades e os relacionamentos dentro de um conjunto de relacionamentos podem ser identificados. Conceitualmente, entidades e    relacionamentos individuais são distintos, entretanto, na perspectiva do banco de dados, a diferença entre ambos deve ser estabelecida em termos de seus atributos. O conceito de chaves nos permite fazer tais distinções.

 

Uma superchave é um conjunto de um ou mais atributos que, tomados coletivamente permitem identificar de maneira unívoca uma entidade em um conjunto de entidades.  Por exemplo, os atributos (nome,numero_conta) e (nome,CPF) do conjunto de entidades cliente são suficientes para distinguir cada elemento do conjunto de entidades, podendo ser considerados como superchaves. Da mesma forma, podemos considerar o atributo CPF como superchave de cliente. O atributo nome não é superchave de cliente, pois algumas pessoas podem ter o mesmo nome. Nosso interesse maior é por superchaves para as quais nenhum subconjunto  possa ser uma superchave.  Essas chaves são chamadas de chaves candidatas.  Das superchaves mencionadas acima, somente (nome,CPF) não poderia ser considerada uma chave candidata, visto que o CPF,sozinho, já o é.

 

Podemos usar o termo chave primária para caracterizar a chave candidata que é escolhida pelo projetista do banco de dados como de significado principal para a identificação de entidades dentro de um conjunto de entidades. Quaisquer duas entidades individuais em um conjunto de entidades não podem ter, simultaneamente, mesmos valores em seus atributos-chave.

 

Nome

CPF

Rua

cidade

Numero_Conta

Ana

1

Maria José

Vitória

900

Maria

2

João da Cruz

Vitória

556

Maria

3

João da Cruz

Vitória

647

José

4

Henrique Rosetti

Vitória

801

José

5

Henrique Rosetti

Vitória

647

 

2.1.3. Definições

 

Relação: Tabela de valores bidimensional organizada em linhas e colunas. Representa um conjunto de entidades do Modelo E/R ou uma classe em um Diagrama de Classes.

 

Ex: Relação Funcionários.

Matrícula

Nome

CPF

Endereço

Dt-Nasc

Dt-Adm

0111

Marcos

17345687691

Vila Velha

11/04/66

20/08/86

0208

Rita

56935101129

Vila Velha

21/02/64

18/03/90

0789

Mônica

81176628911

Vitória

01/11/70

15/07/92

1589

Márcia

91125769120

Serra

20/10/80

01/02/98

...

 

 

 

 

 

 

Grau da Relação: Número de colunas da tabela.

Ex: 6

 

Linha (Tupla): Representa uma entidade do conjunto de entidades, ou um objeto de uma classe.

Ex: Funcionário 0789 do conjunto de Funcionários.

 

Colunas: Representam os vários atributos do conjunto de entidades ou classe.

Ex: Matrícula, Nome, CPF, Endereço, Dt-Nasc, Dt-Adm.

 

Célula: Item de dado elementar da linha i, coluna j.

Ex: Vitória (linha 3, coluna 4)

01/02/98 (linha 4, coluna 6)

 

Chave Primária: Atributo ou combinação de atributos que possuem a propriedade de identificar de forma única uma linha da tabela. Corresponde a um atributo determinante do Modelo Conceitual.

Ex: Matrícula

 

Chaves Candidatas: Ocorrem quando existe, em uma relação, mais de uma combinação de atributos possuindo a propriedade de identificação única.

Ex: Matrícula, CPF

 

Chave Estrangeira: Ocorre quando um atributo de uma relação for chave primária em outra relação.


Ligações: Representam os relacionamentos do Modelo E/R ou Diagrama de Classes. A ligação entre duas relações é feita, em geral, transportando-se a chave de uma relação para outra (item transposto). 

 

A chave da tabela Departamentos foi transposta para a tabela Funcionários. Neste caso, “Departamentos” é denominada relação origem e “Funcionários” relação destino.

 

2.1.4. Propriedades

v     Nenhum campo componente de uma chave primária pode ser nulo;

v     Cada célula de uma relação pode ser vazia (exceto de uma chave primária), ou ao contrário, conter no máximo um único valor;

v     A ordem das linhas é irrelevante;

v     Não há duas linhas iguais;

v     Cada coluna tem um nome e colunas distintas devem ter nomes distintos;

v     Usando-se os nomes para se fazer referência às colunas, a ordem destas torna-se relevante;

v     Cada relação recebe um nome próprio distinto do nome de qualquer outra relação da base de dados;

v     Os valores de uma coluna são retirados todos de um mesmo conjunto, denominado domínio da coluna;

v     Duas ou mais colunas distintas podem ser definidas sobre um mesmo domínio;

v      Um campo que seja uma chave estrangeira ou um item transposto só pode assumir valor nulo ou um valor para o qual exista um registro na tabela onde ela é chave primária.

 

2.1.5. Normalização

 

De uma maneira genérica, uma relação pode conter atributos cujos domínios sejam também relações: dizemos então que a relação esta na forma “não normalizada” e os domínios são do tipo “não simples”.

 

Para a devida utilização de operadores da teoria de conjuntos é necessário que a relação não-normalizada seja transformada numa forma onde os atributos só contenham domínios simples. O processo de transformação de relações não normalizadas às formas melhores de expressão é conhecido como “normalização”.

 

Normalização refere-se ao processo de eliminar informações redundantes, além de outros problemas no projeto de um banco de dados.

 

Primeira Forma Normal (1FN)

Um banco de dados está na Primeira Forma Normal, quando não existem dados repetidos em nenhuma das linhas da tabela.

 

Segundo DATE: “Uma relação R existe na primeira forma normal (1FN) se, e

somente se, todos os domínios subjacentes contiverem apenas valores atômicos”.

 

Exemplo:         Funcionário    Matricula (chave)

                                               Nome

                                               Endereço

Telefones

            Solução:

 

Funcionário    Matricula (chave)

                                               Nome

                                               Endereço

 

Telefones      Matricula  / chave composta \

Telefone   \ chave composta /

 

Segunda Forma Normal (2FN)

 

Quando uma tabela possui uma chave composta, suas colunas devem ser dependentes de toda a chave, e não de apenas uma parte dela. Assim, a tabela estará na Segunda Forma Normal.

 

Segundo DATE: “Uma relação R existe na segunda forma normal (2FN) se, e

somente se, estiver na (1FN) e todos os atributos não chaves forem dependentes da chave principal”.

 

Exemplo: Considere a seguinte tabela, na qual a chave principal é uma combinação das colunas Numero da Fita e Numero do Ator:

Fita     Numero da Fita          / chave composta \

Numero do Ator         \ chave composta /

Título

Nome do Ator

 

Título depende somente do Número da Fita, e Nome do Ator, depende somente do Número do Ator. Quase sempre, a solução é dividir as colunas em duas tabelas e criar uma terceira tabela que correlacione as linhas das duas tabelas:

Fita     Numero da Fita          (chave simples)

Título

 

Ator    Numero do Ator         (chave simples)

Nome do Ator

 

Ator/Fita

Numero da Fita          / chave composta \

Numero do Ator         \ chave composta /

                       

Terceira Forma Normal (3FN)

 

Uma tabela encontra-se na Terceira Forma Normal se todas as suas colunas dependerem de toda a chave principal, e não houver interdependência entre as colunas que não tem chave da tabela.

 

Segundo DATE: “Uma relação R existe na terceira forma normal (3FN) se, e

somente se, estiver na (2FN) e todos os atributos não chave, forem intransitivamente dependentes da chave principal”.

 

Exemplo:         Fita     Numero da Fita (chave)

Título

Categoria

Preço

 

Suponha que a loja determine o preço das fitas por categoria: filmes de Terror, Drama e Comédia custam R$2,00; Musicais por R$2,50 e Lançamentos por R$3,00. Nesse caso, a coluna Preço dependeria não só da coluna Numero da Fita, mas também da coluna Categoria. Esta tabela não está na Terceira Forma Normal. A solução seria criar uma tabela adicional para Preços:

Fita     Numero da Fita (chave)

Título

Categoria

 

Preço  Categoria (chave)

 Preço

 

2.1.6. Linguagens De Consulta

 

Uma linguagem de consulta é uma linguagem na qual um usuário requisita informações do banco de dados. São classificadas como procedurais e não-procedurais. Numa linguagem procedural, um usuário instrui o sistema para executar uma seqüência de operações no banco de dados a fim de computar o resultado desejado. Numa linguagem não-procedural, o usuário descreve a informação desejada sem fornecer um procedimento específico para obter tal informação.

 

Inicialmente, devemos referir-nos apenas às consultas. Uma linguagem completa de manipulação inclui não apenas uma linguagem de consulta, mas também uma linguagem para modificação do banco de dados.

 

2.1.7. Álgebra Relacional

 

A álgebra relacional é uma linguagem de consulta procedural. Ela consiste em um conjunto de operações que tomam uma ou duas relações como entrada e produzem uma nova relação como resultado. As operações fundamentais na álgebra relacional são: selecionar, projetar, renomear, (unárias) - produto cartesiano, união e diferença de conjuntos (binárias). Além das operações fundamentais, existem outras operações, a saber, interseção de conjuntos, ligação natural, dentre outras, que são definidas em termos das operações fundamentais.

 

Figura 2.1: Panorama geral da Álgebra Relacional.

 

 

 

 

 

Considerar o seguinte esquema para exemplos posteriores.

 

Agencias = (Cod_Agencia, Nome_Agencia, Cidade_Agencia)

Clientes = (Cod_Cliente, Nome, rua, cidade)

Depositos = ( Cod_Agencia, Conta_Numero, Cod_Cliente, saldo)

Emprestimos = (Cod_Agencia, Cod_Cliente, Empréstimo_numero, quantia)

 

Operações Fundamentais

 

v     Operação selecionar

 

Seleciona tuplas que satisfazem um dado predicado. Usamos a letra minúscula grega sigma "s"  para representar a seleção. O predicado aparece subscrito em s. A relação argumento aparece entre parênteses seguindo o s.  Assim, para selecionar estas tuplas da relação empréstimo onde o código da agência é  0662, escreve-se:

 

sCod_Agencia=0662(Empréstimos)

 

Podemos encontrar todas as tuplas onde a quantia emprestada seja maior que 1200

 

squantia >1200(Empréstimos)

 

As comparações são permitidas usando =, ¹,<, £> e ³  e os conectivos e (^) e ou (Ú).

 

v     Operação Projetar

 

A operação projetar é uma operação unária que retorna sua relação argumento, com certas colunas deixadas de fora. A projeção é representada pela letra grega pi (p).

 

Suponha  que desejemos uma relação mostrando os clientes e as agências nas quais eles tomaram empréstimos, mas não nos importamos com a quantia e o número do empréstimo. Escrevemos:

pCod_Agencia,Cod_Cliente(Emprestimos)

 

Encontre todos os clientes (Nome) que moram em “Aracruz”.

 

Devemos fazer uma seleção de todos os clientes que moram em Aracruz, em seguida projetar o código destes clientes.

 

p Nome(sclientes-cidade=”Aracruz” (Clientes))

 

v     Operação Produto Cartesiano

 

Capaz de combinar informações a partir de diversas relações. Trata-se de uma operação binária. Esta operação nos mostra todos os atributos das relações envolvidas.

 

Cuidado com ambigüidade de nomes de atributos!

 

Para  selecionarmos todos os nomes dos clientes que possuam empréstimo na agência cujo código é  0662, escrevemos:

 

p Nome (sCod_Agencia=0662 ^ Empréstimo. Cod_Cliente = Clientes. Cod_Cliente  (Emprestimos X Clientes))

 

v     Operação União (binária)

 

A operação união de conjuntos, representada por È, permite-nos encontrar tuplas que estão em uma das relações envolvidas.

Vamos supor se quiséssemos saber todas as pessoas que possuam Depósitos, Empréstimos ou ambos numa determinada agência, com os recursos que temos até agora, não seria possível conseguirmos tal informação. Nessa situação, deveríamos fazer a união de todos que possuam depósitos  com todos que possuam empréstimos nessa agência. Como veremos a seguir.

 

Ex. Selecionar todos os clientes que possuam depósitos  ou empréstimos ou ambos na agência 051.

 

pNome (sCod_Agencia=”051” ^depositos. Cod_Cliente = Clientes. Cod_Cliente(Depositos X Clientes))

È

pNome (sCod_Agencia=”051” ^emprestimos. Cod_Cliente = Clientes. Cod_Cliente(Emprestimos X Clientes))

 

Uma vez que as relações são conjuntos, as linhas duplicadas são eliminadas.

 

Para uma operação União r È s ser válida, necessita-se que duas condições sejam cumpridas:

3       As relações r e s precisam ter a mesma paridade. Isto é, elas precisam ter o mesmo número de atributos;

3       Os domínios do i-ésimo atributo de r e do i-ésimo atributo de s devem ser os mesmos.

 

v     A operação Diferença de conjuntos

 

A operação diferença de conjuntos, representada por -, permite-nos encontrar tuplas que estão em uma relação e não em outra. A expressão r - s resulta em uma relação que contém todas as tuplas que estão em r e não em s.

 

Ex. Encontrar todos os clientes que possuam um depósito, mas não possuem um empréstimo na agência 051.

 

pNome (sCod_Agencia=”051” ^ depósitos.Cod_Cliente = Clientes.Cod_Cliente(Depositos X Clientes))

-

pNome (sCod_Agencia=”051” ^Empréstimos.Cod_Cliente = Clientes.Cod_Cliente(Emprestimos X Clientes))

 

v     Operação Renomear

 

Operação necessária sempre que uma relação aparece mais de uma vez em uma consulta. Representação: r

 

Ex. Encontre todos os clientes que moram na mesma rua e cidade que João.

 

Podemos obter a rua e a cidade de João da seguinte forma:

 

t ß prua, cidade (sNome=”João” (Clientes)) ou t ß sNome=”João” (Clientes)

 

Entretanto, para encontrar outros clientes com esta rua e cidade, devemos referir-nos à relação Clientes pela segunda vez. Perceba que se for inserida novamente uma relação clientes na consulta gerará ambigüidade. Por isso, deve-se renomeá-la.

rClientes2 (Clientes)

 

pcliente2.cliente-.nome (sclientes.cidade = clientes2.cidade ^ clientes.rua = clientes2.rua (t X rClientes2 (Clientes))

 

 

 

Clientes

Cod_Cliente

Nome

rua

Cidade

1

Maria

Rua 1

Cariacica

2

João

Rua 2

Vitória

3

Ana

Rua 3

Cariacica

4

José

Rua 2

Vitória

 

 

Clientes X Clientes2

Cod_Cliente

Nome

Rua

cidade

Cod_Cliente

Nome

rua

Cidade

1

Maria

Rua 1

Cariacica

1

Maria

Rua 1

Cariacica

1

Maria

Rua 1

Cariacica

2

João

Rua 2

Vitória

1

Maria

Rua 1

Cariacica

3

Ana

Rua 3

Cariacica

1

Maria

Rua 1

Cariacica

4

José

Rua 2

Vitória

2

João

Rua 2

Vitória

1

Maria

Rua 1

Cariacica

2

João

Rua 2

Vitória

2

João

Rua 2

Vitória

2

João

Rua 2

Vitória

3

Ana

Rua 3

Cariacica

2

João

Rua 2

Vitória

4

José

Rua 2

Vitória

3

Ana

Rua 3

Cariacica

1

Maria

Rua 1

Cariacica

3

Ana

Rua 3

Cariacica

2

João

Rua 2

Vitória

3

Ana

Rua 3

Cariacica

3

Ana

Rua 3

Cariacica

3

Ana

Rua 3

Cariacica

4

José

Rua 2

Vitória

4

José

Rua 2

Vitória

1

Maria

Rua 1

Cariacica

4

José

Rua 2

Vitória

2

João

Rua 2

Vitória

4

José

Rua 2

Vitória

3

Ana

Rua 3

Cariacica

4

José

Rua 2

Vitória

4

José

Rua 2

Vitória

 

 


 

Exercícios

 

Considere o esquema bancário, abordado anteriormente, para as questões que se seguem.

 

 

1. Selecionar todos os clientes que possuam depósito na mesma cidade onde moram.

 

2. Encontre todas as agências que possuam clientes com nome “Maria” (depósitos  ou empréstimos).

 

3.Usando as Operações Fundamentais, encontre a conta com maior saldo.

 

Considere o esquema seguinte para construir, usando operações fundamentais, da álgebra relacional, as questões que se seguem.

 

Pessoas = (CodPessoa, NomePessoa, Cidade, Chefe)

Empresas = (CodEmpresa, NomeEmpresa, Cidade)

Trabalha = (CodPessoa, CodEmpresa, Salario)

 

4.      Consulte todas as pessoas que trabalham em Vitória.

5.      Consulte todas as pessoas que trabalham na mesma cidade onde moram.

6.      Consulte todas as pessoas que moram na mesma cidade do chefe.

7.      Consulte todas as empresas que funcionam em cidades que não moram Maria.

8.      Consulte todas as pessoas que não trabalham em Vitória e que ganham acima de 2000.

9.      Selecionar o funcionário da empresa de código “01” que possui o menor salário.

 

 


 

Operações não fundamentais

 

Usando as operações fundamentais da álgebra relacional podemos expressar qualquer consulta da álgebra relacional. Entretanto, algumas consultas são longas demais para serem expressas.

 

v     Operação Intersecção de conjuntos

 

A operação Intersecção de conjuntos pode ser expressa em função das operações fundamentais da seguinte forma: r Ç s = r - (r – s).

Representação: ( Ç ).

Suponha que desejemos encontrar todos os clientes com um empréstimo e uma conta na agência “051”.

Escrevemos da seguinte forma:

 

pNome (sCod_Agencia=”051” ^ depositos.Cod_Cliente = Clientes.Cod_Cliente(Depositos X Clientes))

Ç

pNome (sCod_Agencia=”051” ^ emprestimos.Cod_Cliente = Clientes.Cod_Cliente(Emprestimos X Clientes))

 

v     Operação Ligação natural

 

A ligação natural é uma operação binária que permite combinar certas seleções e um produto cartesiano em uma operação. É representada pelo símbolo |X|. A operação ligação natural forma um produto cartesiano de seus dois argumentos, faz uma seleção forçando uma equidade sobre os atributos que aparecem em ambos os esquemas relação.

 

Ex1: “Encontre todos os cliente que tem empréstimos e a cidade em que vivem”.

pNome, cidade (Emprestimos |X| Clientes)

 

Ex2: “Encontre todos os cliente que tem empréstimos e que moram em “Vitória””.

pNome, cidade (scidade=”Vitória”  (Emprestimos |X| Clientes))

 

v     Operação Divisão

 

A operação divisão, representada por ¸, serve para consultas que incluem a frase “para todos”. Suponha que desejemos encontrar todos os clientes que têm uma conta em todas as agências localizadas em “Vitória”. Podemos obter todas as agências de Vitória através da expressão:

 

r1 ß pCod_Agencia (scidade=”Vitória”  (Agências))

 

Podemos encontrar todos os pares Nome, Cod_Agencia nos quais um cliente possui uma conta em uma agência escrevendo:

r2 ß pNome, Cod_Agencia  (Depositos |X| Clientes)

 

Agora precisamos encontrar clientes que apareçam em r2 com cada nome de agência em r1.

 

Escrevemos esta consulta da seguinte forma:

 

pNome, Cod_Agencia  (Depositos |X| Clientes) ¸ pCod_Agencia (scidade=”Vitória”  (Agências))

 

Modificando o banco de dados

 

v     Remoção

 

r = r – E , onde E é uma consulta da álgebra relacional

 

Exemplo1: Excluir todas as contas do cliente de código 01

Depositos = depositos  - (sCod_Cliente = “01”  (Depositos))

 

Exemplo2: Excluir todas as contas de “joão”

 

T ß pCod_Agencia, Conta_Numero, Cod_Cliente, saldo (sNome=”joão”  (Depositos |X| Clientes))

 

Depositos = depositos  - T

 

v     Inserção

 

r = r È E

 

Exemplo1: Depositos = Depositos È {(51, 980987, 1, 1200)}

 

Exemplo2: Gerar um depósito para todas as pessoas que possuem empréstimos. A conta gerada terá o mesmo número do empréstimo e o valor do depósito será igual ao da quantia emprestada.

 

Depositos = Depositos È pCod_Agencia, empréstimo--numero, Cod_Cliente, quantia  (Emprestimos |X| Clientes)

 

v     Atualização

 

Operação Fundamental. Representação: d.

 

dA ß E ( r )

 

Acrescer o saldo de todas as pessoas em 5 %.

dsaldo ß saldo * 1.05  ( Depositos )

 

Suponhamos que contas com saldos superiores a 10.000 recebam 6% de juros e as demais 5%.

 

dsaldo ß saldo * 1.06  (ssaldo > 10000 ( Depositos ))

dsaldo ß saldo * 1.05  (ssaldo <= 10000 ( Depositos ))

 


 

Exercícios

 

Considere o esquema seguinte para construir, usando operações da álgebra relacional, as questões que se seguem.

Fabricante = (codf, nomef)

Automovel = (coda, nomea, preço, codf)

Pessoa = (codp, nomep)

Venda = (codp, coda, data, valor, cor)

 

1)      Quem comprou “Ford”? (fazer duas consultas).

2)      Quem não comprou “Ford”?

3)      Quem comprou carro com ágio?

4)      Quem comprou “Ford” e não comprou “Volks”?

5)      Quem comprou carro entre 01/01/97 e 01/01/98?

6)      Qual é o carro mais caro (nome)?

7)      Atualizar os valores dos automóveis da “GM “ em 15%.

8)      Excluir todas as vendas anteriores a ‘01/01/1990’.

9)      Selecionar todas as pessoas que compraram mais de um carro de diferentes modelos do mesmo fabricante.

 

Considere o esquema abaixo para as questões que se seguem

 

Alunos =                   (Codigo_Aluno, Nome_Aluno, Codigo_Curso, Telefone, Coeficiente)

Cursos =                   (Codigo_Curso, Nome_Curso)

Disciplinas =             (Codigo_Disciplina, Codigo_Curso, Nome_Disc)

Historico =                (Codigo_Aluno, Codigo_Disciplina, Período, Nota)

Pre_Requisitos =       (Codigo_Disciplina_Pos, Codigo_Disciplina_Pre)

 

10.  Selecionar todos os alunos que foram aprovados na disciplina ‘fisica’ no período ‘96/2’.

11.  Selecionar todas as disciplinas do curso ‘Ciencia da Computação’.

12.  Selecionar todas os nomes das disciplinas pré-requisitos da disciplina ‘Estrutura de Dados’.

13.  Selecionar o aluno com maior coeficiente de rendimento no curso de ‘Sistemas de informação’.

14.  Selecionar todos os alunos que não cursaram a disciplina ‘Projeto Final’.

15.  Selecionar todas as disciplinas que ainda não foram cursadas por nenhum aluno.

16.  Selecionar todas as disciplinas que foram cursadas por mais de um aluno.

17.  Selecionar todos os alunos que cursaram todas as disciplinas do curso de ‘Sistemas de Informação’

18.  Selecionar todos os alunos que cursaram Programação I e Cálculo I.

19.  Selecionar todos os alunos que foram reprovados em disciplinas no período ‘99/1’ e foram aprovados, nas respectivas disciplinas,  no período ‘99/2’.

20.  Atualizar a nota do aluno ‘Gabriel Borges’ para 9.8.

21.  Excluir o curso ‘Biblioteconomia’.

Free Web Hosting