Anda di halaman 1dari 5

---------------------------------------------------------Aula 1

Select A1,A2,...
From R1,R2,...
Where condition
Select eID, eNome, nota
From Estudante
Where nota > 3.6;
Select ID, eNome, nota
From Estudante, Candidatura
Where Estudante.eID = Candidatura.eID (join condition, precisa escrever explici
tamente!);
obs: valores duplicados! Diferente da algebra relacinal
Select *distinct* ID, eNome, nota
From Estudante, Candidatura
Where Estudante.eID = Candidatura.eID ;
Select eNome, nota, decisao
From Estudante, Candidatura
Where Estudante.eID = Candidatura.eID
and tam < 1000 and curso = 'CS' and uNome = 'UnB';
Select uNome
From Universidade, Candidatura
Where Universidade.uNome = Candidatura.uNome
and orcamento > 20000 and curso = 'CS';
Ops erro!
Select *Universidade.uNome*
From Universidade, Candidatura
Where Universidade.uNome = Candidatura.uNome
and orcamento > 20000 and curso = 'CS';
;
From Estudante, Universidade, Candidatura
Where Candidatura.eID = Estudante.eID and Candidatura.uNome = Universidade.uNome
;
Obs: Est ordenado! SQLite
Select Estudante.eID, eNome, nota, Candidatura.uNome, orcamento
From Estudante, Universidade, Candidatura
Where Candidatura.eID = Estudante.eID and Candidatura.uNome = Universidade.uNome
*order by nota desc*;
Select Estudante.eID, eNome, nota, Candidatura.uNome, orcamento
From Estudante, Universidade, Candidatura
Where Candidatura.eID = Estudante.eID and Candidatura.uNome = Universidade.uNome
*order by nota desc, orcamento*;
Select eID, curso
From Candidatura
Where curso like '%bio%';

Select *
From Estudante, Universidade;
Usando aritmtica
Select eID, eNome, nota, tam, nota*(tam/1000.0)
From Estudante;
Select eID, eNome, nota, tam, nota*(tam/1000.0) as nota_normalizada
From Estudante;
---------------------------------------------------------Aula 2
* Table Variables -> Renomear!!!
select Estudante.eID, eNome, nota, Candidatura.uNome, orcamento
from Estudante, Universidade, Candidatura
where Candidatura.eID = Estudante.eID and Candidatura.uNome
= Universidade.uNome;
ver resultado
select Estudante.eID, eNome, nota, Candidatura.uNome, orcamento
from Estudante E, Universidade U, Candidatura C
where C.eID = E.eID and C.uNome
= Universidade.uNome;
Buscar pares de estudantes com a mesma nota
select E1.eID, E1.eNome, E1.nota, E2.eID, E2.eNome, E2.nota
from Estudante E1, Estudante E2
where E1.nota = E2.nota;
Obs: pares repetidos
select E1.eID, E1.eNome, E1.nota, E2.eID, E2.eNome, E2.nota
from Estudante E1, Estudante E2
where E1.nota = E2.nota and E1.eID <> E2.eID;
Obs: Cada par duas vezes! Qual a soluo simples?
select E1.eID, E1.eNome, E1.nota, E2.eID, E2.eNome, E2.nota
from Estudante E1, Estudante E2
where E1.nota = E2.nota and E1.eID < E2.eID;
*Unio
Gere uma lista que inclua nomes de universidades e alunos
select uNome from Universidade
union
select eNome from Estudante;
Qual o nome da relao resultante?
select uNome as name from Universidade
union
select eNome as name from Estudante;

O operador de unio em sql, por padro elimina os resultados duplicados.


sqlite tambm "ordena". Mas, nompodemos contar com isso...
Se quiser as duplicadas:
select uNome as name from Universidade
union all
select eNome as name from Estudante;
Se quiseer garantir ordem:
select uNome as name from Universidade
union all
select eNome as name from Estudante
order by name;
*Interseco:
IDs de todos os estudantes que se candidataram aos cursos de 'CS' E 'EE':
select eID from Candidatura where curso = 'CS'
intersect
select eID from Candidatura where curso = 'EE'
Alguns bancos de dados no possuem suporte para o operador de interseco. Ento:
select C1.eID
from Candidatura C1, Candidatura C2
where C1.eID = C2.eID and C1.curso = 'CS' and C2.curso='EE";
Respostas Duplicadas!!!
select distinct C1.eID
from Candidatura C1, Candidatura C2
where C1.eID = C2.eID and C1.curso = 'CS' and C2.curso='EE";
IDs de todos os estudantes que se candidataram aos cursos de 'CS' E NO se candida
taram a 'EE':
select eID from Candidatura where curso = 'CS'
except
select eID from Candidatura where curso = 'EE'
Alguns bancos de dados no possuem suporte para o operador de diferena. Ento:
select E1.eID
from Candidatura C1, Candidatura C2
where C1.eID = C2.eID and C1.curso = 'CS' and C2.curso <> 'EE';
Est errado!!!!!! Muito resultados! Provavelmente repeties. Distinct?
select distinct E1.eID
from Candidatura C1, Candidatura C2
where C1.eID = C2.eID and C1.curso = 'CS' and C2.curso <> 'EE';
Ainda parece que est errado. Compare com o resultado do except. Expliquem!!!!
At agora no d pra resolver!

---------------------------------------------------------Aula 3
Expresses de select encadeadas!
IDs e nomes dos estudantes que se candidataram a CS em alguma universidades
Tradicionalmente
select Estudante.eID, eNome
from Estudante, Candidatura
where Estudante.eID = Candidatura.eID and curso = 'CS';
A outra forma :
Select eID, eNome
from Estudante
where eID in (select eID from Candidatura where curso = 'CS');
Porque tem menos? Duplicadas!
Ana se candidatou a CS em mais de uma universidades!
Select distinct eID, eNome
from Estudante
where eID in (select eID from Candidatura where curso = 'CS');
Agora temos o mesmo resultado!
Select eNome
from Estudante
where eID in (select eID from Candidatura where curso = 'CS');
Os dois Carlos tm ID diferentes
Usando join....
select eNome
from Estudante, Candidatura
where Estudante.eID = Candidatura.eID and curso = 'CS';
Duplicatas! Devemos usar distinct...
Select distinct eNome
from Estudante
where eID in (select eID from Candidatura where curso = 'CS');
Ops! Agora s temos 4 resultados. O que aconteceu?
No temos mais os IDs para diferenciar os dois Carlos.
Mas, porque se preocupar tanto com as duplicatas?
select nota
from Estudante
where eID in (select eID from Candidatura where curso = 'CS");
Suponha que queremos processar a mdia dessas notas.

select nota
from Estudante, Candidatura
where Estudante.eID = Candidatura.eID and curso = 'CS';
Duplicatas... mais resultados. A media estaria errada!
Vamos usar distinct...
select distinct nota
from Estudante, Candidatura
where Estudante.eID = Candidatura.eID and curso = 'CS';
Opa! A mdia ainda est errada!
Isto a nca soluo usar subqueries!
Problema da aula passada...
Achar estudantes que se candidataram ao curso de CS mas no se candidataram ao cur
so de EE, sem usar o operador de diferena.
select eID, eNome
from Estudante
where eID in (select eID from Candidatura where curso = 'CS') and eID not in (se
lect eID from Candidatura where curso = 'EE');
outra forma
select eID, eNome
from Estudante
where eID in (select eID from Candidatura where curso = 'CS') and *not* eID in (
select eID from Candidatura where curso = 'EE');
Outro operador...
select uNome, estado
from Universidade U1
where exists (select * from Universidade U2 where U2.estado = U1.estado);
Encontrar todas universidades que possuem outras universidades no mesmo estado.
Resultado Errado! Cuidado: uma universidade est no mesmo estado dela mesma!