quinta-feira, 3 de setembro de 2020

Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Comando Select

Fala, galera!

Tudo bem?

Comecei meus estudos preparatórios p/ realizar o exame 1Z0-071 da Oracle, que certifica como OCA os aprovados.

Bom hoje eu vou falar um pouco sobre SQL mais especificamente sobre o comando Select.

Vou começar com um pouco da história de como surgiu o SQL.

A linguagem SQL surgiu em meados da década 70 e foi desenvolvida pela IBM Corporation, o sucesso da linguagem foi tão grande, que foi necessário ser padronizado(ANSI), como já citei em um outro artigo que escrevi, nos dias de hoje podemos utilizar o SQL em diversos BD's, cada um podendo ter pequenas variações, no entanto não afetando na padronização global da linguagem.

Enfim, vamos ao que interessa.

Como podemos usar o SQL?

>Consultar dados

>Inserir, deletar e atualizar linhas de uma tabela (DML) - Data Manipulation Language

>Criar, alterar, renomear e deletar objetos de banco de dados (DDL)- Data Definition Language

>Controlar o acesso dos usuários aos objetos do banco - (DCL) - Data Control Language

>Garantir a integridade de dados - Commit e Rollback


Hoje demonstrarei com alguns exemplos práticos, como podemos efetuar consultas de dados utilizando o comando Select. O Select é um dos comandos mais utilizados e também é considerado como um comando (DML).

P/ auxiliar nos estudos, criarei uma tabela, e incluirei alguns registros.

CREATE TABLE empregados(cod_emp   INT PRIMARY KEY

                       ,nm_emp    VARCHAR2(100)

                       ,nm_depto  VARCHAR2(100)

                       ,vlr_sal   NUMBER)

/                       

INSERT INTO empregados VALUES(1, 'Leonardo Silva', 'Almoxarifado', 1500);

INSERT INTO empregados VALUES(2, 'Fabio Brustelo', 'Vendas', 3500);

INSERT INTO empregados VALUES(3, 'Tiago Gomes', 'Compras', 2500);

INSERT INTO empregados VALUES(4, 'Pedro Franchi', 'RH', 1500);

INSERT INTO empregados VALUES(5, 'Pedro Penido', 'Marketing', 4500)

/

COMMIT

/

Comando Select.
Select = Selecione 
* = Todas as colunas
empregados = Tabela

SELECT *
  FROM empregados;








Especificando colunas

SELECT nm_emp, vlr_sal
   FROM empregados;









Utilizando operações aritméticas, contas de somar, subtrair, dividir, tudo pode ser feito, pode ser usada a regra de precedência, é só lembrar da época da escola, das operações matemáticas que vai ajudar.

SELECT nm_emp, vlr_sal, vlr_sal+100
   FROM empregados;



Operação aritmética utilizando a regra de precedência, repare na ultima coluna, o valor fica diferente devido ao uso dos parenteses. 

SELECT nm_emp Nome_Empregado, vlr_sal, 12* vlr_sal+200, 12*(vlr_sal+200)
   FROM empregados;



Alterando os nomes das colunas (Alias), você pode precisar montar um relatório direto do grid de dados, dessa maneira podem ser colocados títulos nas colunas.

SELECT nm_emp nome_empregado, vlr_sal valor_salario
   FROM empregados;



Caso seja necessário trabalhar o titulo c/ letras maiúsculas e minusculas e espaços.

SELECT nm_emp AS "Nome Empregado", vlr_sal as "Valor Salario"
   FROM empregados;



Concatenação, significa juntar, ligar, no caso abaixo, uniremos um valor literal + a coluna nm_emp.

SELECT 'Empregado: '|| nm_emp AS "Nome Empregado", vlr_sal as "Valor Salario" 
   FROM empregados;



Distinct

Pra falar sobre esse comando, vou inserir mais um registro na tabela de exemplo.

INSERT INTO empregados VALUES(6, 'Bernardo Brustelo', 'Vendas', 4500)

/

COMMIT

/

Reparem no select abaixo, onde eu trago apenas a coluna nm_depto, onde uma das informações se repete.

SELECT nm_depto
  FROM empregados;


Com o uso do comando Distinct, eliminamos as informações duplicadas.


Bom, por hoje é só, e até a próxima.

Abs,


Leonardo SIlva.






quarta-feira, 2 de setembro de 2020

Tipos de Joins

Fala, galera.

Mais um assunto muito legal, e muito utilizado no dia a dia de quem trabalha com Oracle ou com qualquer outro banco de dados relacional.

O Join é a ferramenta básica do dia a dia de trabalho em um banco de dados relacional, é uma ferramenta que pode ser usada p/ recuperação de dados em qualquer banco, seja ele SQL Server, DB2, Oracle, Postgre, MYSQL, enfim, creio que esses sejam os mais utilizados atualmente.

Antes de começar a falar dos tipos de Joins, quero comentar um pouco a respeito do padrão ANSI-(American National Standards Institute).

O ANSI foi muito importante na definição de padrões no começo da internet, o que também definiu o padrão pra escrita de JOINS - (ANSI-SQL), ou seja para que o seu JOIN funcione em qualquer banco de dados relacional, o mesmo precisa ser escrito no padrão ANSI-SQL. Para mais informações sobre essa empresa acesse: www.ansi.org.

Como o foco desse blog é falar de Oracle, vou demonstrar os JOINS utilizando o padrão ANSI-SQL e também utilizando a forma de escrita em PL/SQL.

Dai você pode estar se perguntando, por que perder tempo entendendo como funciona o padrão ANSI-SQL? E é ai que vem o pulo do gato, se você for estudar pra tirar qualquer certificação Oracle, vai perceber que as queries que estão nos materiais de estudo/ provas, estão no padrão ANSI-SQL, portanto se você pensa em tirar alguma certificação, vai ter que aprender o padrão. Outra vantagem desse tipo de escrita é a  possibilidade de migrar as queries p/ qualquer outro banco de dados relacional sem precisar alterar, ou seja, existem muitas vantagens em utilizar desse padrão, mas vamos lá que tem muita coisa legal pra falarmos.

A palavra-chave JOIN é utilizada p/ obter dados de duas ou mais tabelas baseado em um relacionamento de colunas destas tabelas.

Para ajudar na demonstração dos tipos de Joins criei as duas tabelas abaixo, e inclui alguns registros.

CREATE TABLE turma(cod_turma  int primary key

                            ,nm_turma   VARCHAR2(50))

/

CREATE TABLE aluno(cod_aluno  int primary key

                  ,nm_aluno   VARCHAR2(50)

                  ,cod_turma  NUMBER)

/

INSERT INTO turma VALUES(1, 'Manhã');

INSERT INTO turma VALUES(2, 'Tarde');

INSERT INTO turma VALUES(3, 'Noite')

/

COMMIT;

INSERT INTO aluno VALUES(1, 'Ana Luiza', NULL);

INSERT INTO aluno VALUES(2, 'Ana Paula', 1);

INSERT INTO aluno VALUES(3, 'Guilherme Pereira', 1);

INSERT INTO aluno VALUES(4, 'Vinicius Silva', 2);

INSERT INTO aluno VALUES(5, 'Leonardo Mattos', NULL)

/

COMMIT;


Tipos de JOINS 

*INNER JOIN 

Este é o formato mais comum de JOIN, que irá retornar apenas os dados com informações correspondentes nas duas tabelas.

No caso abaixo, eu trago os registros dos alunos que estejam cadastrados em alguma turma.

Padrão ANSI-SQL

SELECT a.*, b.*

  FROM aluno a

  INNER JOIN turma b ON b.cod_turma = a.cod_turma;



Query no padrão Tradicional

SELECT a.*, b.*

  FROM aluno a

      ,turma b

 WHERE a.cod_turma = b.cod_turma;


* LEFT JOIN

Este tipo de JOIN pode ser utilizado quando queremos recuperar os dados da primeira tabela, mesmo se não houver dado correspondente na segunda tabela.

Padrão ANSI-SQL

SELECT a.*, b.*

  FROM aluno a

  LEFT JOIN turma b ON b.cod_turma = a.cod_turma;

Repare que a query retornou todos os registros da tabela 1(aluno), independente da ligação com a tabela 2(Turma).


Query no padrão Tradicional

SELECT a.*, b.*

  FROM aluno a

      ,turma b

 WHERE a.cod_turma = b.cod_turma(+)  

  

* RIGHT JOIN

Este tipo de JOIN pode ser utilizado quando queremos recuperar os dados da segunda tabela, mesmo se não houver dado correspondente na primeira tabela.

Padrão ANSI-SQL

SELECT a.*, b.*

  FROM aluno a

  RIGHT JOIN turma b ON b.cod_turma = a.cod_turma;


Repare a query retornou todos os registros da tabela 2(Turma), independente da ligação com a tabela 2(Turma)


Query no padrão Tradicional

SELECT a.*, b.*

  FROM aluno a

      ,turma b

 WHERE a.cod_turma(+) = b.cod_turma


* FULL JOIN

Neste caso juntos o INNER JOIN mais as linhas sem associação, tanto do lado direto(RIGHT JOIN), quanto do lado esquerdo(LEFT JOIN), não sendo possível utilizar nenhum filtro nas tabelas, ex1, caso seja necessário utilização de algum filtro será necessário executar um sub-select, ex2.

Obs: Esse tipo JOIN não tem suporte no padrão tradicional.

Ex1

SELECT a.*, b.*

  FROM aluno a

  FULL JOIN turma b ON b.cod_turma = a.cod_turma;


Ex2 - Filtrei apenas os alunos c/ código de turma preenchido.

SELECT a.*, b.*

  FROM (SELECT * 

          FROM aluno aa

         WHERE aa.cod_turma IS NOT NULL) a

  FULL JOIN turma b ON b.cod_turma = a.cod_turma;  


* CROSS JOIN

Pode ser utilizado quando for necessária a junção de duas ou mais tabelas por cruzamento, esse tipo de JOIN também é conhecido como produto cartesiano entre duas tabelas.

SELECT a.*, b.* FROM aluno a CROSS JOIN turma b 

ORDER BY a.cod_aluno, b.cod_turma;

Coloquei um order by na query pra evidenciar bem os dados repetidos (Produto Cartesiano)


Query no padrão Tradicional

SELECT a.*, b.* FROM aluno a, turma b 


É isso, pessoal. Espero que tenham gostado e até a próxima.

Abs.

Leonardo Silva.





Estudando para o exame de certificação Oracle Database SQL | 1Z0-071 - Comando Merge

Fala, galera. Tudo bem? Hoje vou falar um pouco sobre o comando MERGE. O MERGE é um comando DML que combina as funções de insert, update e d...