-- Exemplificação de comandos SQL x AR
-- SELEÇÃO
-- Definição..: Gera uma subconjunto de linhas a partir de uma tabela com as linhas atendendo a uma condição.
-- Sintaxe AR.: <tab> [[ condição ]]
-- Exemplo.AR.: medicos [[ ]]
-- Sintaxe SQL: 
-- Exemplo SQL:
select * from medicos where ceinstituicao IS null; /* o operador de null é o 'is' ou 'is not' */
select * from medicos where ceespecialidade >= 4;  /* usando um operador simples de comparação */
select * from medicos where ceinstituicao IS null and ceespecialidade >= 4; /* usando o operador lógico AND */
-- ------------------------------------------------------------------------------------------------
-- PROJEÇÃO
-- Definição..: Gera uma tabela copiando os dados de colunas de tabela de origem
-- Sintaxe AR.: <tab> [[ nomes dos campos (separados por ',') ]]
-- Exemplo AR.: medicos [[ cpmedico, txnomemedico, nucrm ]]
-- Sintaxe SQL: select <lista de campo> from <tab>;
-- Exemplo SQL:
select cpmedico, txnomemedico, nucrm from medicos;
-- Esta tabela existe somente em tempo de execução (memória RAM), entretanto, pode seer necessário 'guardar' os dados
-- processados uma tabela. Para isso usamos o comando que 'TRANSFERE' os dados tabela. Na forma:
-- consultando os dados de med1
-- pode ser necessário, as vezes, criar uma tabela com dados temporários.
-- Em SQL, isso é possível, na forma:
create table med1 as (select cpmedico, txnomemedico, nucrm from medicos);
-- O comando dentro dos () é dito 'aninhado' por isso existe a referencia (livros) de comandos com 'aninhamento'.
select * from med1;
-- removendo o arquivo 'materializado'
drop table med1;
-- 'Materializando' em memória
create temporary table med2 as (select cpmedico, txnomemedico, nucrm from medicos);
select * from med2;
drop table med2;
-- Tanto med1 quanto med2 estão 'ocupando' espaço no computador. Portanto, é de praxe remover estas tabelas.
drop table med1, med2;
-- ------------------------------------------------------------------------------------------------
-- PRODUTO CARTESIANO
-- Definição..: Emparelhamento de cada linha de uma tabela com todas as linhas de outra tabela.
-- Sintaxe AR.: <tab1> X <tab2> -- ANSI:87
--              <tab1> <LEFT | RIGTH | INNER | FULL OUTER | CROSS >JOIN <tab2> ON <condição> -- ANSI:92
-- para o ProdCart: <tab1> CROSS JOIN <tab2>
-- Exemplo AR.: armazens X livros
-- Sintaxe SQL: select * from <tab1> CROSS JOIN <tab2>;
-- Exemplo SQL:
select * from armazens cross join livros; /* esta linha tem o comentário seguido do comando */
-- ------------------------------------------------------------------------------------------------
-- JUNÇÃO NATURAL (Fechada)
-- Definição..: Emparelhamento de cada linha de uma tabela com todas as linhas de outra tabela,
--              ATENDENDO a uma CONDIÇÃO
-- Sintaxe AR.: <tab1> [[ condição do emparelhamento ]] <tab2>
-- Exemplo AR.: clientes [[ clientes.celogradouro=logrcompleto.cplogradouro ]] logrcompleto
-- Sintaxe SQL: select * from <tab1> inner join <tab2> ON <tab1>.campo=<tab2>.campo;
-- Exemplo SQL:
select * from clientes inner join logrcompleto on clientes.celogradouro=logrcompleto.cplogradouro;
-- Explorando um pouco além do comando e analisando as sintaxes de 87 e 92
-- escrevendo uma junção entre três tabelas 
select * from autores;
select * from autorias;
select * from livros;

-- Em SQL ANSI:87
select * from autores, autorias, livros
         where autores.cpautor=autorias.ceautor and
               autorias.celivro=livros.cplivro;
-- Sobre este comando ainda podemos combinar uma operação de projeção.
select cpautor, txnomeautor, cplivro, txtituloacervo
       from autores, autorias, livros
       where autores.cpautor=autorias.ceautor and
             autorias.celivro=livros.cplivro;

-- EM SQL ANSI:92 (agora usando o operador )
select * from autores inner join autorias on autores.cpautor=autorias.ceautor
                      inner join livros on autorias.celivro=livros.cplivro;
-- Agora combinando com a projeção (apresentada acima)
select cpautor, txnomeautor, cplivro, txtituloacervo
       from autores inner join autorias on autores.cpautor=autorias.ceautor
                    inner join livros on autorias.celivro=livros.cplivro;
-- Se ainda quisermos ver os livros de um determinado autor, podemos escrever a
-- condição da seleção depois de um subcomando where, na forma:
select cpautor, txnomeautor, cplivro, txtituloacervo
       from autores inner join autorias on autores.cpautor=autorias.ceautor
                    inner join livros on autorias.celivro=livros.cplivro
	   where autores.cpautor=20;
-- ------------------------------------------------------------------------------------------------
