Buscar

Curso SQL e PL SQL parte 1

Prévia do material em texto

Curso 
SQL 
e 
PL/SQL
Parte 1
Principais Objetivos do Curso
· Conhecer os principais conceitos e aspectos gerais do banco de dados Oracle.
· Criar tabelas, primary Keys, foreign keys, unique keys e checks.
· Executar Selects simples e complexas.
· Executar Selects com Sub-Selects.
· Funções gerais de consulta em banco de dados Oracle.
· Criar blocos anônimos em PL/SQL.
· Usar If, For, While.
· Criar Procedures, Function, e Triggers.
· Criar e manipular cursor, packages.
· Comandos UNION, INTERSECT, MINUS, ROLLUP, CUBE, DENSE_RANK, MERGE, EXECUTE IMMEDIATE.
· Criar DataBase e Links.
· 
· Co
· DFffffffff
· 
· 
História do SQL
O Dr.EF Codd publicou o artigo “Um modelo Relacional de Dados para Grandes Bancos de Dados Compartilhados”, em junho de 1970 na revista Association of Computer Machinery (ACM), Communications of the ACM. O modelo do Codd agora é aceito como modelo definitivo para sistemas de gerenciamento de banco de dados relacional (RDBMS). O idioma, SEQUEL (Structured Query Language) foi desenvolvido pela IBM Corporation, Inc., para usar o modelo do Codd. SEQUEL mais tarde se tornou SQL. Em 1979, a Relational Software, Inc. (agora Oracle) introduziu a primeira implementação comercialmente disponível do SQL. Hoje, o SQL é aceito como a linguagem RDBMS padrão.
A Oracle se esforça para cumprir os padrões aceitos pelo setor e participa ativamente dos comitês de padrões SQL. Os comitês aceitos pelo setor são o American National Standards Institute (ANSI) e a International Organization for Standardization (ISO), que é afiliada à International Eletrotechnical Commission (IEC). O ANSI e o ISSO / IEC aceitaram o SQL como a linguagem padrão para banco de dados relacionais. Quando um novo padrão SQL é publicado simultaneamente por essas organizações, os nomes dos padrões estão de acordo com as convenções usadas pela organização, mas os padrões são tecnicamente idênticos.
Tipos de instruções SQL
Existem 5 tipos de instruções SQL, conforme abaixo:
· DQL (Data Query Language): a linguagem de consulta de dados tem a função de retorna as linhas armazenadas em uma tabela do banco de dados. Uma consulta é realizada utilizando a instrução “SELECT”.
· DML (Data Manipulation Language): a linguagem de manipulação de dados tem a função de modificar o conteúdo das tabelas. São três instruções DML:
INSERT – Adiciona linhas em uma tabela.
UPDATE – Modifica linhas em uma tabela.
DELETE – Remove linhas de tabela. 
· DDL (Data Definition Language): a linguagem de definição de dados tem a função de definir a estrutura de dados, existem 5 tipos de instruções DDL:
CREATE – Cria um objeto de banco de dados, por exemplo: Create table, Create or Replace procedure, Create trigger, Create user.
ALTER – Modifica um objeto do banco de dados, por exemplo: Alter table.
DROP – Remove um objeto do banco de dados, por exemplo: Drop table, Drop view, Drop package.
RENAME – Muda o nome de uma tabela.
TRUNCATE – Apaga todas as linhas de uma tabela.
· TC (Transation Control): a linguagem de controle de transações tem a função de grava definitivamente as operações realizadas ou desfaz as mesmas.
COMMIT – Grava permanentemente as alterações nas linhas da tabela (insert, update, delete).
ROLLBACK – Desfaz as alterações realizadas nas linhas da tabela.
SAVEPOINT – Define um “ponto de salvamento” onde você pode reverter as alterações.
· DCL (Data Control Language): a linguagem de controle de dados tem a função de alterar as permissões em objetos do banco de dados
GRANT – Concede a outro usuário acesso a seu objeto do banco de dados.
REVOKE – Não permite que outro usuário tenha acesso a seu objeto de banco de dados.
Comandos SQL básicos
Sintaxe básica do comando SELECT
SELECT nome_coluna FROM nome_tabela ;
Observação:
· Comandos SQL não fazem distinção entre maiúsculas e minúsculas.
· Comandos SQL podem estar em uma ou mais linhas.
· Palavras chaves (Keywords) não podem ser abreviadas ou divididas em mais de uma linha.
· Cláusulas são normalmente colocadas em linhas separadas.
· Tabulações e indentações são utilizadas para melhorar a visualização do comando.
Expressões Aritméticas
Crie expressões em dados tipo NUMBER e DATE utilizando operadores aritméticos.
	Operador
	Descrição
	+
	Soma
	-
	Subtração
	*
	Multiplicação
	/
	Divisão
Precedência dos Operadores
1. Multiplicação
2. Divisão
3. Soma
4. Subtração
· Multiplicação e divisão possuem prioridade sobre adição e subtração.
· Operadores de mesma prioridade são avaliados da esquerda para direita.
· Parênteses são usados para forçar prioridade de avaliação e para tornar a codificação mais clara.
Definindo um Valor Nulo
· Um nulo é um valor que é indisponível, não atribuído, desconhecido ou inaplicável.
· Um nulo não é o mesmo que zero ou um espaço em branco.
Valores Nulos em Expressões Aritméticas
· Expressões aritméticas contendo valores nulos resultam em nulo.
Definindo Alias (Pseudônimo) de Coluna
· Altera o cabeçalho de uma coluna.
· É útil em cálculos.
· Segue imediatamente o nome da coluna; palavra-chave AS entre o nome da coluna e o Alias é opcional.
· Requer aspas duplas se ele possui espaços ou caracteres especiais ou deve diferenciar maiúsculas de minúsculas.
Exemplo:
SELECT 
coluna_1 + coluna_2 AS soma
FROM nome_tabela;
Operador de Concatenação
· Concatena colunas ou strings de caracteres a outras colunas.
· É representado através de duas barras verticais (||).
· Cria coluna resultante que é uma expressão caractere.
Exemplo:
SELECT
coluna_1 || coluna_2 AS coluna_3
FROM nome_tabela;
Strings de Caracteres Literais
· Um literal é qualquer caractere, expressão ou número incluídos na lista da cláusula SELECT.
· Valores literais do tipo data e caractere devem ser colocados entre aspas simples.
· Cada string de caractere é exibida uma vez para cada linha retornada.
Exemplo:
SELECT 
nome_aluno || ‘ nasceu em ’ || data_nascimento AS “Nascimento do Aluno”
FROM tabela_aluno;
Linhas Duplicadas
· A exibição padrão de consultas lista todas as linhas, incluindo linhas duplicadas.
Eliminando Linhas Duplicadas
· Elimine linhas duplicadas utilizando a palavra-chave DISTINCT na cláusula SELECT.
Exemplo:
SELECT
DISTINCT 
nome_coluna
FROM nome_tabela;
Restringindo e Ordenando Dados
Objetivos
· Limitar as linhas recuperadas por uma consulta.
· Ordenar as linhas recuperadas por consulta.
Limitando as Linhas Selecionadas
Na sintaxe: 
WHERE: restringe a consulta para as linhas que satisfazem a condição.
Condition: é composta de nomes de coluna, expressões, constantes, e operadores de comparação.
Exemplo: estado = ‘RS’;
Utilizando a Cláusula WHERE
Exemplo:
SELECT
cd_aluno,
nome,
nascimento
FROM tb_aluno
WHERE estado = ‘RS’;
Strings de Caractere e Datas
· Strings de caractere e valores tipo data são inclusos entre aspas simples.
· Valores caractere fazem distinção entre maiúsculas e minúsculas e valores tipo data são sensíveis ao formato.
Operadores de Comparação
	Operador
	Significado
	=
	Igual a
	>
	Maior que
	>=
	Maior que ou igual a
	<
	Menor que
	<=
	Menor que ou igual a
	!= ou <> 
	Diferente de
Outros Operadores de Comparação
	Operador
	Significado
	BETWEEN AND
	Entre dois valores (inclusive)
	IN(list)
	Igual a um dos valores da lista
	LIKE
	Igual a um padrão de caracteres
	IS NULL
	Possui um valor nulo
	IS NOT NULL
	Não possui um valor nulo
Ordenando Dados
A cláusula ORDER BY é usada para classificar os registros no seu conjunto de resultados. A cláusula ORDER BY pode ser usada apenas em instruções SELECT.
Exemplo:
SELECT
nome_coluna
FROM nome_tabela
WHERE ORDER BY nome_coluna ASC ou DESC; 
ASC: Opcional. Classifica o conjunto de resultados em ordem crescente por expressão.
DESC: Opcional. Classifica o conjunto de resultados em ordem decrescente por expressão. 
Precedência de Operadores Lógicos 
1. Parêntese ()
2. AND
3. OR
Funções Básicas do Oracle SQL e PL/SQL
Objetivos 
· Descrever os vários tipos de funções disponíveis em SQL.
· Utilizar funções do tipo caractere, numéricas e de datas em comandos SELECT.
· Descrever o usode funções de conversão.
Tipos de Funções SQL
SINGLE-ROW: Estas funções operam em linhas únicas retornando um resultado para cada linha processada.
MULTIPLE-ROW: Estas funções manipulam grupos de linhas para obter um resultado para cada grupo processado
Funções do Tipo SINGLE-ROW
· Manipulam itens de dados.
· Recebem argumentos e retornam um valor.
· Atuam sobre cada linha recuperada.
· Retornam um resultado por linha.
· Podem modificar o tipo de um dado.
· Podem ser aninhadas.
Funções de String (Caracteres), Comparação e Data
	Função
	Propósito
	CONCAT
(column1|expression1,
column2|expression2)
	Concatena a primeira string de caracteres com a segunda.
Equivalente ao operador de concatenação (||)
	INITCAP
(column|expression)
	Converte strings de caractere deixando a primeira letra de cada palavra em maiúscula e as demais em minúscula
	INSTR
(column|expression., m)
	Retorna a posição numérica do caráter dentro da string
	LENGTH
(column|expression)
	Retorna o número (comprimento) de caracteres string
	LOWER (column|expression)
	Converte strings de caractere para minúsculas
	LPAD
(column|expression., n, ‘string’)
	Retorna uma string com tamanho total de n (comprimento) especificado à esquerda
	REPLACE 
(x, search_string, replace_string)
	Procura a string search_string em x e substitui por replace_string
	RPAD
(column|expression,
n, ‘string’)
	Retorna uma string com tamanho total de n (comprimento) especificado à direita
	SUBSTR 
(column|expression
, m [, n])
	Retorna os caracteres especificados a partir da string de caracteres, começando na posição m, com tamanho de n caracteres. Se m for negativo, a contagem inicia a partir do final da string. Se n for omitido, são retornados todos os caracteres até o final da string
	UPPER (column|expression)
	Converte strings de caractere para maiúsculas
Exemplos de funções (sintaxe):
CONCAT: a função CONCAT possui duas formas de ser escrita.
1. SELECT CONCAT (coluna1, coluna2) FROM nome_tabela;
2. SELECT coluna1 ||' - '|| coluna1 FROM nome_tabela; 
INITCAP
SELECT INITCAP (coluna) FROM nome_tabela;
INSTR
SELECT INSTR (coluna, 'R') FROM nome_tabela;
LENGTH
SELECT LENGTH (coluna) FROM nome_tabela;
LOWER
SELECT LOWER (coluna) FROM nome_tabela;
UPPER
SELECT UPPER (coluna) FROM nome_tabela;
LPAD
SELECT LPAD (coluna, 5, '0') FROM nome_tabela;
RPAD
SELECT RPAD (coluna, 8, '0') FROM nome_tabela;
SUBSTR
SELECT SUBSTR (coluna, 3, 6) FROM nome_tabela;
· O primeiro (3) número da função determina início. 
· O segundo (6) número da função determina a quantidade.
 
Funções 
	Função 
	Propósito
	ROUND
(coluna, integer)
	É uma função matemática que arredonda um número para cima ou para baixo de acordo com os dígitos especificados
	TRUNC
(coluna, integer)
	A TRUNC função (número) retorna n1 truncada para n2 casas decimais. Se n2 for omitido, n1 será truncado para 0 casas decimais. n2 pode ser negativo para truncar (zerar) n2 dígitos à esquerda do ponto decimal.
	 MOD
(expression, integer)
	MOD ou resto da divisão, retorna o restante de n2 divido por n1. Retorna n2 se n1 for 0.
	SYSDATE
	SYSDATE retorna a data e hora atuais definidas para o sistema operacional no qual o banco de dados reside.
	MONTH_BETWEEN
	Retorna o número de meses entre as datas date1 e date2. Se date1 for posterior a date2, o resultado será positivo.
	ADD_MONTHS
	Retorna a data DATE mais n meses. O argumento date pode se um valor datetime ou qualquer valor que possa ser implicitamente convertido em DATE.
	NEXT_DAY
	Retorna a data do primeiro dia da semana nomeada por char que é posterior à data especificado. 
	LAST_DAY
	Retorna a data do último dia do mês que contém.
	EXTRACT
EXTRACT (YEAR FROM SYSDATE)
	Extraia um valor de um campo de data e hora, por exemplo, ANO, MÊS, DIA... de um valor de data e hora.
Exemplos de funções (sintaxe):
Lembrete dual, uma tabela especial usada para avaliar expressões ou chamar funções.
ROUND
SELECT ROUND (45.925, 2) FROM dual;
TRUNC
SELECT TRUNC (45.929, 2) FROM dual;
MOD
SELECT MOD (10, 2) FROM dual;
SYSDATE
SELECT SYSDATE FROM dual;
MONTH_BETWEEN
SELECT MONTH_BETWEEN (date1, date2) FROM dual;
ADD_MONTHS
SELECT ADD_MONTHS (SYSDATE, 5) FROM dual;
NEXT_DAY
SELECT NEXT_DAY (SYSDATE, ‘QUARTA-FEIRA’) FROM dual;
LAST_DAY
SELECT LAST_DAY (SYSDATE) FROM dual;
EXTRACT
SELECT EXTRACT (YEAR FROM SYSDATE) FROM dual;
Formatação de data utilizando a função de conversão TO_CHAR
Formato de Dia do mês ‘DD’ em número
SELECT TO_CHAR (SYSDATE, ‘DD’) FROM dual;
Formato de Dia/Mês/Ano ‘DD/MM/YYYY’ em número
SELECT TO_CHAR (SYSDATE, ‘DD/MM/YYYY’) FROM dual;
Formato de Mês ‘MM’ em número
SELECT TO_CHAR (SYSDATE, ‘MM’) FROM dual;
Formato de Ano ‘YYYY’ em número
SELECT TO_CHAR (SYSDATE, ‘YYYY’) FROM dual;
Formato de Ano com 2 últimos dígitos ‘YY’ em número
SELECT TO_CHAR (SYSDATE, ‘YY’) FROM dual;
Formato de Mês ‘MONTH’ em palavra
SELECT TO_CHAR (SYSDATE, ‘MONTH’) FROM dual;
Formato de Dia da semana ‘D’ em número
SELECT TO_CHAR (SYSDATE, ‘D’) FROM dual;
Formato de Dia da semana ‘DY’ em palavra abreviado
SELECT TO_CHAR (SYSDATE, ‘DY’) FROM dual;
Formato de Dia da semana ‘DAY’ em palavra
SELECT TO_CHAR (SYSDATE, ‘DAY’) FROM dual;
Formato de Ano ‘YEAR’ em palavra em idioma inglês
SELECT TO_CHAR (SYSDATE, ‘YEAR’) FROM dual;
Escrevendo Data por extenso 
SELECT TO_CHAR (SYSDATE,' "SÃO PAULO", fmDAY "," DD "de" fmMonth "de" YYYY') FROM dual;
Continuação formatação de data utilizando a função de conversão TO_CHAR
Formato de Hora e Minuto ‘HH24:MI’ em número
SELECT TO_CHAR (SYSDATE, ‘HH24:MI’) FROM dual;
Formato de Hora, Minuto e segundo ‘HH24:MI:SS’ em número
SELECT TO_CHAR (SYSDATE, ‘HH24:MI:SS’) FROM dual;
Formato de Data com Dia, Mês, Hora e Minuto ‘DD/MM HH24:MI’ em número
SELECT TO_CHAR (SYSDATE, ‘DD/MM HH24:MI’) FROM dual;
Formato de Data completo ‘DD/MM HH24:MI:SS’ em número
SELECT TO_CHAR (SYSDATE, ‘DD/MM HH24:MI:SS’) FROM dual;
Formatação de valores monetários com a função TO_CHAR
Símbolos 
L: R$
G: ponto
D: vírgula decimal
Exemplo:
SELECT TO_CHAR (SALARIO,'L99G999D99') 
FROM nome_tabela;
Funções
	Função 
	Propósito
	NVL
(expr1, expr2)
	Permite substituir nulo (retornando com espaço em branco) por uma sequência nos resultados de uma consulta. Se expr1 for nulo, NVL retornará expr2. Se expr1 não for nulo, NVL retornará expr1.
	NVL2
(expr1, expr2, expr3)
	A função NVL2 permite determinar o valor retornado por uma consulta com base no fato de uma expressão especificada ser nula ou não nula. 
Exemplos de funções (sintaxe):
NVL
SELECT NVL (expr1, expr2) FROM nome_tabela;
Caso o valor da expr1 for nulo o NVL substitui por expr2, se não prevalece a expr1.
NVL2
SELECT NVL2(expr1, expr2, expr3) FROM nome_tabela;
Caso o valor da expr1 for nulo o NVL2 substitui por expr3, se não vai prevalecer o valor da expr2.
Funções 
	Função
	Propósito
	CASE expressão_pesquisa
 WHEN expressão1 THEN result1
 WHEN expressão2 THEN result2
 WHEN expressãoN THEN result3
 ELSE resultado_padrão
 END
	CASE compara expr com cada pesquisa valor um por um. Se expr for igual a pesquisa, o Oracle Database retornará o correspondente result. Se nenhuma correspondência for encontrada, o Oracle Database retornará padrão. Se o padrão for omitido, o Oracle retornará nulo.
	Decode(expressão_pesquisa,
'expressão1',' result1',
'expressão2',' result2',
'expressão3',' result3',
'resultado_padrão’) 
	DECODE compara expr com cada pesquisa valor um por um. Se expr for igual a pesquisa, o Oracle Database retornará o correspondente result. Se nenhuma correspondência for encontrada, o Oracle Database retornará padrão. Se o padrão for omitido, o Oracle retornará nulo.
CASE
SELECT CASE expressão_pesquisa
 	WHEN expressão1 THEN result1
 	WHEN expressão2 THEN result2
 	WHEN expressãoN THEN result3
 	ELSE resultado_padrão
 	END
FROM nome_tabela;
DECODE
SELECT DECODE (expressão_pesquisa,
'expressão1',' result1',
'expressão2',' result2',
'expressão3',' result3',
'resultado_padrão’) 
FROM nome_tabela;
Exibindo dados de múltiplas tabelas
Objetivos· Escrever comandos SELECT para acessar dados a partir de mais de uma tabela utilizando diversos tipos de joins.
· Visualizar dados que geralmente não correspondem a condição de join utilizando outer joins.
· Executar um join de uma tabela com ela mesma (self join).
Tipos de joins
Em um banco de dados relacional, instruções SQL do tipo DML (Data Manipulation Language) são muito utilizadas – como próprio nome já diz – para manipulação de dados. Muitas vezes precisamos exibir os dados de várias tabelas, uma Join é o que precisamos, pois, através desta conseguiremos recuperar dados de mais de uma tabela. Neste artigo vamos demonstrar alguns Joins, nos padrões SQL89 e ANSI92 ou SQL92, são eles: Inner join, Left Join, Right Join, Full J oin e Cross join, sendo as duas primeiras as mais utilizadas em nosso dia-a-dia.
Produto Cartesiano
Um produto cartesiano é formado quando:
· Uma condição de Join é omitida.
· Uma condição de Join é invalida.
· Todas as linhas da primeira tabela são unidas à todas as linhas da segunda tabela.
· Para evitar um produto cartesiano, sempre inclua uma condição de Join válida na cláusula WHERE.
Inner join
Este tipo de Join deverá ser usado quando o resultado esperado entre duas ou mais tabelas seja por coincidência, ou seja, para cada linha da primeira linha da primeira tabela queremos a(s) linha(s) da segunda tabela correspondente(s). 
· Padrão Tradicional (SQL89):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, DEPARTMENTS D
WHERE D.DEPARTMENT_ID = E. DEPARTMENT_ID
AND E.EMPLOYEE_ID = 200;
· Padrão ANSI (SQL92):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, 
INNER JOIN DEPARTMENTS D
ON D.DEPARTMENT_ID = E. DEPARTMENT_ID
WHERE E.EMPLOYEE_ID = 200;
 	Left Join
Este tipo de Join deverá ser usado quando o resultado esperado NÃO seja por coincidência, sendo assim, irá retornar as linhas da primeira tabela mesmo que não haja correspondência na segunda tabela.
· Padrão Tradicional (SQL89):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, DEPARTMENTS D
WHERE D.DEPARTMENT_ID (+) = E. DEPARTMENT_ID
AND E.EMPLOYEE_ID = 200;
· Padrão ANSI (SQL92):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, 
LEFT JOIN DEPARTMENTS D
ON D.DEPARTMENT_ID = E. DEPARTMENT_ID
WHERE E.EMPLOYEE_ID = 200;
Right Join
Este é outro tipo de Join onde o resultado esperado NÃO seja por coincidência, mas, neste caso irá retornar as linhas da segunda tabela mesmo que não haja correspondência na primeira.
· Padrão Tradicional (SQL89):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, DEPARTMENTS D
WHERE D.DEPARTMENT_ID = E. DEPARTMENT_ID (+)
AND E.EMPLOYEE_ID = 200;
· Padrão ANSI (SQL92):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, 
RIGHT JOIN DEPARTMENTS D
ON D.DEPARTMENT_ID = E. DEPARTMENT_ID
WHERE E.EMPLOYEE_ID = 200;
Full Join
Neste caso juntamos o Inner Join com a listagem de todas as outras linhas não associadas, tendo do lado direito Right Join quanto do lado esquerdo Left join, NÃO sendo possível utilizar filtros nas tabelas (Exemplo1), mas, caso seja necessário, é preciso executar o SELECT antes na tabela colocando os filtros para depois executar o Full Join (Exemplo2).
· Padrão ANSI (SQL92) – Exemplo 1:
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, 
FULL JOIN DEPARTMENTS D
ON D.DEPARTMENT_ID = E. DEPARTMENT_ID;
· Padrão ANSI (SQL92) – Exemplo 2:
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM (	SELECT * FROM EMPLOYEES
WHERE EMPLOYEE_ID = 200 ) E
FULL JOIN DEPARTMENTS D
ON D.DEPARTMENT_ID = E. DEPARTMENT_ID;
	
Lembrete o padrão SQL89 não tem suporte ao Full Join.
Cross Join
Deve ser usado quando for necessário juntar duas ou mais tabelas por cruzamento. Para cada linha da tabela EMPLOYEES queremos todos os DEPARTMENTS ou vice-versa. Ele também é chamado de produto cartesiano entre tabelas.
· Padrão Tradicional (SQL89):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, DEPARTMENTS D;
· Padrão ANSI (SQL92):
SELECT 	E.EMPLOEE_ID,
		E.LAST_NAME,
	 	E.DEPARTMENT_ID,
	 	D. DEPARTMENT_ID,
		D.LOCATION_ID
FROM 	EMPLOYEES E, 
CROSS JOIN DEPARTMENTS D;
Qualificando nomes de colunas ambíguas 
· Utiliza prefixos de tabela para qualificar nomes de colunas que estão em múltiplas tabelas.
· Aumente a performance utilizando prefixos de tabela.
· Faça distinção de colunas que possuem nomes idênticos, mas residem em tabelas diferentes utilizando alias de colunas.
Utilizando funções de grupos
Objetivos
· Identificar as funções de grupo disponíveis.
· Descrever o uso de funções de grupo.
· Agrupar dados utilizando a cláusula GROUP BY.
· Incluir ou excluir linhas agrupadas utilizando a cláusula HAVING.
Introdução às funções agregadas do Oracle
As funções agregadas do Oracle calculam em um grupo de linhas e retornam um único para cada grupo.
Geralmente usamos as funções de agregadas junto com a GROUP BY cláusula divide as linhas em grupos e uma função agregada calcula e retorna um único resultado para cada grupo.
Se você usar funções agregadas sem uma GROUP BY cláusula, as funções agregadas serão aplicadas a todas as linhas das tabelas ou visualizações consultadas.
Também usamos as funções agregadas na HAVING cláusula para filtrar grupos da saída com base nos resultados das funções agregadas.
Oracle funções agregadas podem aparecer em SELECT listas e ORDER BY, GROUP BY, e HAVING cláusulas.
Funções
	Função 
	Propósito 
	AVG (column)
	Valor médio n, ignorando valores nulos
	COUNT (column)
	Número de linhas, onde expr computa somente os valores diferentes de nulo. Para contar todas as linhas selecionadas utilize *, incluindo linhas duplicadas e com valores nulos.
	MAX (column)
	Valores máximos de expr, ignorando valores nulos.
	MIN (column)
	Valor mínimo de expr, ignorando valores nulos.
	SUM (column)
	Soma dos valores de n, ignorando valores nulos.
 
Exemplo de funções (sintaxe):
AVG
SELECT AVG (nome_coulna) FROM nome_tabela;
COUNT
SELECT COUNT (nome_coulna) FROM nome_tabela;
MAX
SELECT MAX (nome_coluna) FROM nome_tabela;
MIN
SELECT MIN (nome_coluna) FROM nome_tabela;
SUM
SELECT SUM (nome_coluna) FROM nome_tabela;
Lembrete colunas que não são utilizadas em funções de grupo dentro de uma consulta devem ser colocadas na cláusula GROUP BY, caso isso aconteça o Oracle acusará um erro ORA-00937: não é uma função de grupo de simples.
Manipulando Dados
Objetivos
· Descrever cada comando DML.
· Inserir linhas em uma tabela.
· Atualizar linhas de uma tabela.
· Remover linhas de uma tabela.
· Controlar transações.
Linguagem de manipulação de dados
Um comando DML é executado quando você:
· Adiciona novas linhas para uma tabela.
· Modifica linhas existentes em uma tabela.
· Remove linhas de uma tabela.
Uma transação consiste de um conjunto de comandos DML que formam uma unidade lógica trabalho.
INSERT 
INSERT INTO nome_tabela (coluna1, coluna2, coluna3)
VALUES (10, ‘LUCAS’, TO_DATE(‘10/01/2020’, ‘DD/MM/YYYY’));
UPDATE
UPDATE nome_tabela
SET coluna = ‘novo_valor’
WHERE condição;
DELETE
DELETE FROM nome_tabela
WHERE condição;
Criando e gerenciando tabelas
Objetivos
· Descrever os principais objetos do banco de dados.
· Criar tabelas.
· Descrever os tipos de dados que podem ser utilizados na definição de colunas.
· Alterar a definição de tabelas.
· Remover, renomear e truncar tabelas.
Convenções de nomes
· Devem começar com letra.
· Podem possuir de 1 até 30 caracteres de tamanho,nas versões 10g, 11g, 12c.
· Devem conter somente A-Z, a-z, 0-9, _, $, e #.
· Não pode possuir o mesmo nome de outro objeto criado pelo mesmo usuário.
· Não pode ser uma palavra reservada do servidor Oracle.
Comando CREATE TABLE
CREATE TABLE OWNER.nome_tabela (
nome_coluna DATATYPE);
Você especifica:
· Nome da tab ela.
· Nome da coluna, tipo de dado e tamanho da coluna.
Opção DEFAULT
· Valores válidos são valores literais expressões ou funções SQL.
· Valores ilegais são nomes de outras colunas ou pseudo-colunas.
· O tipo de dado da opção DEFAULT deve corresponder ao tipo de dado da coluna.
Consultando o dicionário de dados
· Visualize as tabelas criadas pelo usuário:
SELECT * FROM user_tables;
· Visualize os tipos de objetos distintos criados pelo usuário:
SELECT * FROM user_objects;
· Visualize as tabelas, visões, sinônimos e sequences criadas pelo usuário:
SELECT * FROM user_catalog;
· Visualize colunas, tabelas e clusters acessíveis ao usuário atual:
SELECT * FROM all_tab_columns;
· Visualize as tabelas relacionais ao usuário atual:
SELECT * FROM all_tables;
· Visualize todos os objetos que pertencem ao usuário e aos quais tem acesso:
SELECT * FROM all_objects;
· Visualize as informações detalhadas sobre as colunas das tabelas:
SELECT * FROM user_tab_columns;
· Visualize as definições de constraints nas tabelas pertencentes a seu usuário:
SELECT * FROM user_constraints;
Alterando estrutura da tabela
· Adicionando coluna na tabela
ALTER TABLE nome_tabela ADD nome_coluna DATATYPE;
· Modificando colunas na tabela
ALTER TABLE nome_tabela MODIFY nome_coluna DATATYPE; 
· Renomeando coluna na tabela
ALTER TABLE nome_tabela RENAME COLUMN nome1 TO nome2;
· Excluindo coluna na tabela
ALTER TABLE nome_tabela DROP COLUMN nome_coluna;
· Excluindo tabela
DROP TABLE nome_tabela;
· Desabilita a coluna
ALTER TABLE nome_tabela SET UNUSED (nome_coluna);
· Excluir colunas não usadas
ALTER TABLE nome_tabela DROP UNUSED COLUMNS;
· Truncando a tabela
TRUNCATE TABLE nome_tabela;
Lembrete: TRUNCATE TABLE exclui todos os registros da tabela, não tem WHERE e não tem COMMIT ou ROLLBACK.
Implementando constraints
Objetivos
· Descrever constraints de integridade.
· Criar e administrar constraints.
O que são constraints?
· Constraints garantem regras a nível de tabela.
· A constraint deve ser satisfeita para a operação para ter sucesso.
· Constraints previnem a exclusão de um a tabela se existirem dependências.
	Constraint
	Descrição
	NOT NULL
	Especifica que uma coluna não pode conter valores nulos.
	UNIQUE KEY
	Especifica que uma coluna ou combinação de coluna cujos valores devem ser únicos para todas as linhas da tabela.
	PRIMARY KEY
	Identifica de forma única cada linha da tabela.
	FOREIGN KEY
	Estabelece e garante um relacionamento de chave estrangeira entre a coluna e uma da tabela referenciada.
	CHECK
	Especifica uma condição que deve ser verdadeira.
Diretrizes para constraints
· Forneça um nome para a constriant ou o Servidor Oracle gerará um nome utilizando o formato SYS_Cn.
· Crie a constraint:
No mesmo momento em que a tabela é criada.
Após a tabela ter sido criada.
· Defina a constraint no nível da coluna ou tabela.
· Visualize a constraint no dicionário de dados USER_CONSTRAINTS.
Criando constraints
· PRIMARY KEY
1- Primeira forma (Na criação da tabela)
CREATE TABLE tabela_1 (
cd_tabela_1 NUMERIC,
CONSTRAINT nome_pk PRIMARY KEY (cd_tabela_1)
);
2 - Segunda forma (Após a tabela ter sido criada)
ALTER TABLE tabela_1 ADD CONSTRAINT nome_pk
PRIMARY KEY (cd_tabela_1);
· FOREIGN KEY
1- Primeira forma (Na criação da tabela)
CREATE TABLE tabela_2 (
cd_tabela_2 NUMERIC,
cd_tabela_1 NUMERIC,
CONSTRAINT nome_fk
FOREIGN KEY (cd_tabela_1)
REFERENCES tabela_1 (cd_tabela_1)
);
2- Segunda forma (Após a tabela ter sido criada)
ALTER TABLE tabela_2 ADD CONSTRAINT nome_fk
FOREIGN KEY (cd_tabela_1)
REFERENCES tabela_1 (cd_tabela_1);
· UNIQUE KEY
1- Primeira forma (Na criação da tabela)
CREATE TABLE tabela_1 (
cd_tabela_1 NUMERIC,
CONSTRAINT nome_uk
UNIQUE (cd_tabela_1)
) ;
2- Segunda forma (Após a tabela ter sido criada)
ALTER TABLE tabela_1 ADD CONSTRAINT nome_uk 
UNIQUE (cd_tabela_1);
· NOT NULL 
1- Primeira forma (Na criação da tabela)
CREATE TABLE tabela_1 (
cd_tabela_1 NUMERIC NOT NULL
) ;
2- Segunda forma (Após a tabela ter sido criada)
ALTER TABLE tabela_1 
MODIFY cd_tabela_1 NUMERIC NOT NULL;
· CHECK
1- Primeira forma (Na criação da tabela)
CREATE TABLE tabela_1 (
cd_tabela_1 NUMERIC,
CONSTRAINT nome_ck
CHECK (cd_tabela_1 = ‘10’, ‘20’)
) ;
2- Segunda forma (Após a tabela ter sido criada)
ALTER TABLE tabela_1 ADD CONSTRAINT nome_ck
CHECK (cd_tabela_1 = ‘10’, ‘20’);
Desabilitando e excluindo constraints
· Desabilitando constraint
ALTER TABLE nome_tabela DISABLE CONSTRAINT nome_constraint;
· Habilitando constraint
ALTER TABLE nome_tabela ENABLE CONSTRAINT nome_constraint;
· Excluindo constriant
ALTER TABLE nome_tabela DROP CONSTRAINT nome_constraint;
· Excluindo constraint com filhos dependentes
ALTER TABLE nome_tabela DROP CONSTRAINT nome_constraint CASCADE CONSTRAINT;
Criando Visões (Views)
Objetivos
· Descrever uma visão.
· Criar uma visão.
· Recuperar dados através de uma visão.
· Alterar a definição de uma visão.
· Inserir, atualizar e remover dados através de uma visão.
· Remover uma visão.
O que é uma visão?
· É uma tabela lógica baseada em uma tabela ou outra visão.
· As tabelas nas quais uma visão é baseada são chamadas de tabelas básicas.
· A visão é armazenada como um comando SELECT no dicionário de dados.
Visões Simples e Visões Complexas
	Característica
	Visão Simples
	Visão Complexa
	Número de tabelas
	Uma
	Uma ou mais
	Contém funções
	Não
	Sim
	Possui grupos de dados
	Não
	Sim
	DML através da visão
	Sim
	Talvez
· Criando View
CREATE OR REPLACE VIEW nome_view
AS Query;
· Executando View
SELECT * FROM nome_view;
· Criando View somente de leitura
CREATE OR REPLACE VIEW nome_view
AS Query WITH READ ONLY; 
Introdução a criação de objetos de banco de dados
Objetivo
· Criar, alterar e utilizar sequences.
· Criar e alterar índices.
O que é Sequence?
· Automaticamente gera números únicos.
· É um objeto compartilhado.
· É normalmente utilizada para criar valores para chaves primárias.
· Substitui código de aplicação.
· Criando Sequence
CREATE SEQUENCE nome_sequence
INCREMENT BY valor_incremental
START WITH valor_inicial
MAXVALUE valor_maximo
MINVALUE valor_minimo
CYCLE aceita_ciclos
NOCYCLE não_aceita_ciclos
CACHE aceita_cache
NOCACHE não_aceita_cache;
	
Lembrete: defina uma sequence para gerar números sequenciais automaticamente. Muito utilizada em chaves primárias (PRIMARY KEY) e chaves artificiais de dimensões (SURROGATE KEY).
· Verificando valor atual da sequence
	SELECT nome_sequence.CURRVAL FROM dual;
· Chamando o valor da sequence
INSERT INTO nome_tabela (nome_coluna)
VALUES (nome_sequence.NEXTVAL);
Criação e manutenção de índices e sinônimos
O que é um índice?
Índices são uma das ferramentas de otimização mais conhecidas e utilizadas pelos desenvolvedores de banco de dados.
O emprego de indexação em tabelas pode aumentar significativamente a performance em consultas ao banco de dados, porém pode diminuir a velocidade de transações como INSERTs e UPDATEs. Portando, saber quais tarefas são mais importantes no sistema em questão – se de leitura ou de escrita – nos dá um ponto de partida para saber como lidar com a indexação.
No geral, é interessante termos mais de um índice em uma tabela. O atributo (ou conjunto de atributos) usado para procurar registros em uma tabela é chamado de chave de procura.
Por padrão, os SGBDs criam índices automaticamente para campos de:
· Chave Primária.
· Chave Estrangeira.
· Constran UNIQUE.
Chamados de Índices Clusterizados
Além disso, podemos criar índices para outras colunas usadas com frequência em buscas ou junções.
Classificamos os índices em duas grandes categorias:
· Índices Clusterizados(primários).
· Índices Não-Clusterizados(secundários).Índices Clusterizdo
Os Índices clusterizados alteram a forma como os dados são armazenados em um banco de dados, pois ele classifica as linhas de acordo com a coluna que possui o índice. Uma tabela pode ter
· Uma chave primaria.
· Mais de uma chave estrangeira.
· Uma Constriant UNIQUE.
Geralmente ele está na coluna que é chave primária da tabela ou, em sua ausência, em uma coluna UNIQUE.
Caso uma tabela não possua um índice clusterizado, suas linhas são armazenadas em uma estrutura não-ordenada chamada de heap.
Normalmente, a chave de busca de um índice primário é a chave primária da tabela (mas nem sempre).
Índice Não-Clusterizado
Em um índice não-clusterizado a forma como os dados são armazenados em disco não é alterada, e um objeto separado é criado na tabela, apontando para as linhas da tabela original após a busca. Este tipo de índice se baseia em valores-chave.
Uma tabela pode ter vários índices não-clusterizados.
Os índices secundários melhoram o desempenho das consultas que usam chaves diferentes da chave de procura do índice primário. O projetista do banco de dados deve decidir quais índices não-clusterizados devem ser criados com base na estimativa da frequência de consultas e atualizações dos registros.
· Criando INDX Não-Clusterizado
CREATE INDEX nome_indx
ON nome_tabela (nome_coluna);
· Excluindo INDX Não-Clusterizado
DROP INDEX nome_indx;

Continue navegando