-- Guia De Comandos AR-SQL para estudo
-- Vamos apresentar os comandos de SQL (traduzidos de AR)
-- DCL
   -- grant
   -- revoke
-- DDL
   -- create
   -- alter
   -- drop
-- DQL - Data Query language
   -- Seleção
      -- definindo: Gera uma lista de dados de uma tabela que ATENDA a uma condição
	  -- Em AR: <tab> [[ condição ]]
	  -- Em SQL: select * from <tab> [where <condição>];
	  -- Notas:
	  -- É 'prodecessada' somente UMA tabela na seleção
	  -- o operador WHERE é opcional.
	  -- Exemplo
	  select * from funcionarios where 1=1;
	  select * from funcionarios where vlsalario >=20000 and vlsalario <=40000;
	  select * from funcionarios where vlsalario between 20000 and 40000;
	  select * from funcionarios where funcaoid is not  NULL;
-- ------------------------------------------------------------------------------------------------------------------------------
   -- Projeção
      -- definindo: mostra todas as linhas de uma tabela com as colunas (ou campos)escolhidos
	  -- Em AR: <tab> [[ lista de campos ]]
	  -- Em SQL: select <lista de campos> from <tab>;
	  -- Notas
	  -- O operador WHERE não faz parte da especificação da projeção
	  -- Exemplo
	  select f.idfuncionario, f.txprenomes, f.txsobrenome, f.dtnascimento, f.dtcontratacao from funcionarios as f;
	  -- COMBINANDO COMANDOS 
	  select f.idfuncionario, f.txprenomes, f.txsobrenome from funcionarios as f WHERE f.vlsalario>=50000;
	  -- Esse comando combina as operações de Seleção e Projeção, podendo ser a tradução para SQL da operação:
	  -- funcionarios[[idfuncionario,txprenmes, txsobrenome]][[vlsalario>=50000]]
-- ------------------------------------------------------------------------------------------------------------------------------
   -- Produto Cartesiano
   -- Definindo: Faz o EMPARELHAMENTO das linhas de duas tabelas
   -- Em AR: <tab1> X <tab2>
   -- Em SQL: 87 - select * from Tab1, Tab2;
   --         92 - select * from Tab1 CROSS JOIN Tab2;
   -- Notas
   -- Os complementos do JOIN são: INNER, LEFT, RIGHT, CROSS e FULL OUTER
   -- exemplos:
   select * from funcoes cross join autores;  -- notar a estrutura da tabela resultado
   select * from autores as a cross join funcoes as f;
   select a.idautor, a.txnomeautor, f.idfuncao, f.txnomefuncao from autores as a cross join funcoes as f;
   select a.idautor, a.txnomeautor from autores as a;
   select f.idfuncao, f.txnomefuncao from funcoes as f;
   select * from (select idautor, txnomeautor from autores) as a CROSS JOIN (select idfuncao, txnomefuncao from funcoes) as f
-- ------------------------------------------------------------------------------------------------------------------------------
   -- Junção FECHADA
   -- Definindo: Faz o EMPARELHAMENTO das linhas de duas tabelas que atendam a uma CONDIÇÃO
   -- Em AR: <tab1> [[ Condição ]] <tab2>
   -- Em SQL: 87 - select * from Tab1, Tab2 WHERE <condição>;
   --         92 - select * from Tab1 INNER JOIN Tab2 ON <condição>;
   -- Notas:
      -- A Condição, na maioria da vezes, é a comparação do valor de uma chave primária com uma chave estrangeira
	  -- Existem SGBDs que têm o complemento do JOIN denominado NATURAL (NATURAL JOIN) que exige que a CP e CE tenham o MESMO NOME e Omitem o subcomando ON.
   -- exemplos:
   select * from clientes as c , armazens as a where c.idcliente = a.clienteid;  [ANSI:87]
   select * from clientes as c INNER JOIN armazens as a ON c.idcliente = a.clienteid;  [ANSI:92]
   -- Dá para combinar operações da AR para 'simplificar' a estrutura da tabela resultado.
   select c.idcliente, c.txnomecliente, c.txrazaosocial, a.idarmazem, a.txnomearmazem
          from clientes as c INNER JOIN armazens as a ON c.idcliente = a.clienteid;
   select f.idfuncionario, f.txprenomes, f.txsobrenome, f.funcaoid, fc.idfuncao, fc.txnomefuncao
          from funcionarios as f INNER join funcoes as fc on f.funcaoid = fc.idfuncao;
-- ------------------------------------------------------------------------------------------------------------------------------
   -- Junções Complementares (JAD JAE JC)
   -- Definindo: Faz o EMPARELHAMENTO das linhas de duas tabelas que atendam a uma CONDIÇÃO, trazendo TODAS AS LINHAS de uma ou amabas Tabelas.
   -- Em AR: <tab1> ][ Condição ]] <tab2>
   --        <tab1> [[ Condição ][ <tab2>
   --        <tab1> ][ Condição ][ <tab2>
   -- Em SQL: select * from Tab1 LEFT JOIN Tab2 ON <condição>; [ANSI:92]
   --         select * from Tab1 RIGHT JOIN Tab2 ON <condição>; [ANSI:92]
   --         select * from Tab1 FULL OUTER JOIN Tab2 ON <condição>; [ANSI:92]
   -- Notas:
   -- Exemplos:
   select c.idcliente, c.txnomecliente, c.txrazaosocial, a.idarmazem, a.txnomearmazem
          from clientes as c LEFT JOIN armazens as a ON c.idcliente = a.clienteid;
   select f.idfuncionario, f.txprenomes, f.txsobrenome, f.funcaoid, fc.idfuncao, fc.txnomefuncao
          from funcionarios as f left join funcoes as fc on f.funcaoid = fc.idfuncao;
   select f.idfuncionario, f.txprenomes, f.txsobrenome, f.funcaoid, fc.idfuncao, fc.txnomefuncao
          from funcionarios as f right join funcoes as fc on f.funcaoid = fc.idfuncao;
   select f.idfuncionario, f.txprenomes, f.txsobrenome, f.funcaoid, fc.idfuncao, fc.txnomefuncao
          from funcionarios as f full outer join funcoes as fc on f.funcaoid = fc.idfuncao;   
-- ------------------------------------------------------------------------------------------------------------------------------
   -- União
   -- Definindo: Gera uma tabela com as linhas de uma tabela de origem acrescidas das linhas de outra tabela.
   -- Em AR: <tab1> U <tab2>
   -- Em SQL: select * from Tab1 UNION [ALL] (select * from Tab2)
   -- Notas: As tabelas da origem DEVEM SER União Compatíveis (tabelas com campos com os mesmo TIPOS DE DADOS, Tamanho e Dominio de valor)
   -- Exemplos:
   -- Para fazer a união temos que criar tabelas UC.
   create temporary table f1 as (select * from funcoes where qtanosprefuncao>=5);
   create temporary table f2 as (select * from funcoes where qtanosprefuncao<=5);
   -- Conferindo os conjuntos
   select * from f1;
   select * from f2;
   -- Fazendo a união
   select * from f1 UNION ALL (select * from f2);
-- ------------------------------------------------------------------------------------------------------------------------------
   -- Diferença (Subtração)
   -- Definindo: Gera uma tabela com as linhas de uma tabela de origem que estão estão na primeira tabela E NÃO ESTÃO na segunda tabela.
   -- Em AR: <tab1> - <tab2>
   -- Em SQL: select * from Tab1 EXCEPT (select * from Tab2)
   -- Notas: As tabelas da origem DEVEM SER União Compatíveis (tabelas com campos com os mesmo TIPOS DE DADOS, Tamanho e Dominio de valor)
   -- Exemplos:
   select * from f1 EXCEPT (select * from f2);
   select * from f2 EXCEPT (select * from f1);
-- ------------------------------------------------------------------------------------------------------------------------------
   -- Intersecção
   -- Definindo: Gera uma tabela com as linhas de uma tabela que tambémn estão em outra tabela.
   -- Em AR: <tab1> ^ <tab2>
   -- Em SQL: select * from Tab1 INTERSECT (select * from Tab2)
   -- Notas: As tabelas da origem DEVEM SER União Compatíveis (tabelas com campos com os mesmo TIPOS DE DADOS, Tamanho e Dominio de valor)
   -- Exemplos:
   select * from f1 INTERSECT (select * from f2);
   -- Nota
   -- A ^ B = A - (A - B)
   select * from f1 except (select * from f1 except (select * from f2));
-- ------------------------------------------------------------------------------------------------------------------------------
-- DTL - Data Transaction language
   -- INSERT
   -- UPDATE
   -- DELETE