-- seleção
select * from medicos where fkespecialidade='2';
-- --------------------------------------------------------------------------------------------------------------------------------
-- projeção
SELECT pkarmazem, armazens.txnomearmazem FROM armazens
-- --------------------------------------------------------------------------------------------------------------------------------
-- produto cartesiano
   -- ANSI:87
   select * from bairros, cores;
   -- ANSI:92
   select * from bairros cross join cores;
-- --------------------------------------------------------------------------------------------------------------------------------
-- junção fechada (natural)
   -- ANSI:87
   select * from departamentos, funcionarios where departamentos.fkfuncionariogerente = funcionarios.pkfuncionario;  
   -- ANSI:92
   select * from funcionarios inner join departamentos ON departamentos.fkfuncionariogerente = funcionarios.pkfuncionario;
-- --------------------------------------------------------------------------------------------------------------------------------
-- junção aberta pela direita (ANSI:92)
select * from medicos right join especialidadesmedicas on pkespecialidade=fkespecialidade;
-- --------------------------------------------------------------------------------------------------------------------------------
-- junção aberta pela esquerda (ANSI:92)
select * from autores left join autorias on autores.pkautor=autorias.fkautor;
-- --------------------------------------------------------------------------------------------------------------------------------
-- junção completa (aberta dir-esq) (ANSI:92)
-- para a junção completa alteramos os dados de funcionarios com o comando
update funcionarios SET fkfuncao=NULL  where pkfuncionario<= 50;
-- e a seguir executamos
select * from funcionarios full outer join funcoes on fkfuncao=pkfuncao;
-- O comando é executado sem erros.
-- --------------------------------------------------------------------------------------------------------------------------------
-- Preparando as tabelas para União, Subtração e Intersecção.
-- SELECT * FROM public.bancos where aocompetencia in ('C','E') ORDER BY aocompetencia ASC;
-- SELECT * FROM public.bancos where aocompetencia in ('E','F','I') ORDER BY aocompetencia ASC;
-- Agora vamos gerar tabelas "TEMPORÁRIAS" para o processamento das operações U, ^ e - 
CREATE temporary TABLE A AS (SELECT * FROM public.bancos where aocompetencia in ('C','E') ORDER BY aocompetencia ASC);
CREATE temporary TABLE B AS (SELECT * FROM public.bancos where aocompetencia in ('E','F','I') ORDER BY aocompetencia ASC);
SELECT * FROM A;
SELECT * FROM B;
-- --------------------------------------------------------------------------------------------------------------------------------
-- União
-- A U B
SELECT * FROM A UNION (SELECT * FROM B); -- ANSI:92 O Union NÃO apresenta as linhas repetidas.
                                          -- para ver as repetidas completa-se o comando com ALL
SELECT * FROM A UNION ALL (SELECT * FROM B); 
-- --------------------------------------------------------------------------------------------------------------------------------
-- Intersecção
-- A ^ B
SELECT * FROM A WHERE EXISTS (SELECT * FROM B WHERE A.pkbanco=B.pkbanco and
                                                     A.txnomebanco=B.txnomebanco and
                                                     A.dtfundacao=B.dtfundacao and
                                                     A.nucnpjbanco=B.nucnpjbanco and
                                                     A.txsigla=B.txsigla and
                                                     A.aocompetencia=B.aocompetencia and
                                                     A.website=B.website and
                                                     A.aosituacao=B.aosituacao and
                                                     A.aohistorico=B.aohistorico and
                                                     A.fklogradourosede=B.fklogradourosede and
                                                     A.txcomplemento=B.txcomplemento and
                                                     A.nucepsede=B.nucepsede and
                                                     A.qtagencias=B.qtagencias and
                                                     A.aocapitalaberto=B.aocapitalaberto and
                                                     A.dtcadbanco=B.dtcadbanco); -- ANSI:87
-- Por conta da existência de valores NULOS, o comando acima não retorna linhas pois a comparação de campos com NULO NÃO
-- pode ser feita com '=', e sim com "IS NULL" ou "IS NOT NULL".
SELECT * FROM A INTERSECT (SELECT * FROM B); -- ANSI:92
-- --------------------------------------------------------------------------------------------------------------------------------
-- Subtração
-- A - B
SELECT * FROM A MINUS (SELECT * FROM B); -- ANSI:87
SELECT * FROM A EXCEPT (SELECT * FROM B); -- ANSI:92
-- --------------------------------------------------------------------------------------------------------------------------------
-- Comandos de atualização.
-- --------------------------------------------------------------------------------------------------------------------------------
-- Inclusão de linhas
INSERT INTO cores (pkcor,txnomecor,nupantone,dtcadcor)
       VALUES ('11','Vermelho Beterraba','145512','2021-03-10'),
	          ('12','Vermelho Beliscão','145513','2021-03-10');
-- --------------------------------------------------------------------------------------------------------------------------------
-- Alteração de valores
UPDATE cores SET pkcor=12 WHERE pkcor=11 AND txnomecor='Vermelho Beliscão';
-- note que o '=' tem significado diferente dependendo do comando que está sendo usado (SET - atribuição, WHERE - Condição)
-- --------------------------------------------------------------------------------------------------------------------------------
-- Exclusão de linhas
DELETE FROM cores WHERE pkcor>=11;
-- --------------------------------------------------------------------------------------------------------------------------------

