TOR12CF1 - Oracle 12c - Fundamentals I - SQL e SQL (Versão 2015)
TOR12CF1 - Oracle 12c - Fundamentals I - SQL e SQL (Versão 2015)
TOR12CF1
Junho/2015
Apostila desenvolvida especialmente para a Target Informática Ltda.
Sua cópia ou reprodução é expressamente proibida.
Oracle 12c: Fundamentals I - SQL e SQL Developer
Sumário
1. ...Introdução ........................................................................................................................ 1
Objetivos ................................................................................................................................................................ 2
Ciclo de Vida do Desenvolvimento de Sistemas ..................................................................................... 3
Análise e Estratégia ....................................................................................................................................3
Design .............................................................................................................................................................3
Construção e Documentação .................................................................................................................3
Transição ........................................................................................................................................................3
Produção ........................................................................................................................................................4
Armazenamento de Dados em Diferentes Mídias.................................................................................. 5
Armazenando Informações .....................................................................................................................5
Conceito de Banco de Dados Relacional ................................................................................................... 6
Modelo Relacional ......................................................................................................................................6
Componentes do Modelo de Dados Relacional ..............................................................................6
Definição de Banco de Dados Relacional .................................................................................................. 7
Banco de Dados Relacional .....................................................................................................................7
Modelos de Dados ............................................................................................................................................. 8
Propósito dos Modelos.............................................................................................................................8
Modelo Entidade-Relacionamento .............................................................................................................. 9
Modelo ER .....................................................................................................................................................9
Benefícios do Modelo ER .........................................................................................................................9
Componentes Chaves ................................................................................................................................9
Convenções do Modelo Entidade-Relacionamento ............................................................................ 10
Entidades ..................................................................................................................................................... 10
Atributos...................................................................................................................................................... 10
Relacionamentos ...................................................................................................................................... 10
Identificadores Únicos ............................................................................................................................ 11
Terminologia Utilizada em Bancos de Dados Relacionais ................................................................. 12
Relacionando Múltiplas Tabelas.................................................................................................................. 14
Diretrizes para Chaves Primárias e Chaves Estrangeiras ............................................................ 14
Propriedades de um Banco de Dados Relacional ................................................................................. 15
Comunicando com um SGDB utilizando SQL ........................................................................................ 16
Structured Query Language - SQL ..................................................................................................... 16
Sistema de Gerenciamento de Banco de Dados ................................................................................... 17
Conheça o Mundo Oracle ............................................................................................................................. 18
Oracle Database ....................................................................................................................................... 18
Oracle Application Express (APEX) ..................................................................................................... 18
Oracle Application Server...................................................................................................................... 18
Oracle Designer ........................................................................................................................................ 18
Oracle Developer...................................................................................................................................... 18
Oracle Discover ......................................................................................................................................... 19
Produtos Oracle ........................................................................................................................................ 19
Portal de Tecnologia Oracle - OTN ................................................................................................... 19
8. ...Sub-consultas ...............................................................................................................206
Objetivos ........................................................................................................................................................... 207
Utilizando uma Sub-consulta para Resolver um Problema ........................................................... 208
Sub-consultas.................................................................................................................................................. 209
1. Introdução
Objetivos
Discutir os aspectos teóricos e físicos de um Banco de Dados;
Descrever a implementação Oracle;
Descrever como SQL é utilizado nos produtos Oracle;
Detalhar as tabelas utilizadas no curso.
Análise e Estratégia
Estudo e análise das necessidades de negócio. Entrevistas com usuários e
gerentes para identificar as necessidades de informações.
Construção dos modelos do sistema. Conversão das narrativas em uma
representação gráfica de informações e regras de negócio necessárias.
Confirmação e refinamento do modelo com os analistas e peritos.
Design
Projete o banco de dados baseado no modelo desenvolvido na fase de análise
e estratégia.
Construção e Documentação
Construa o protótipo do sistema. Escreva e execute os comandos para criar as
tabelas e os objetos de suporte para o banco de dados.
Desenvolva a documentação de usuário, texto de ajuda, e os manuais de
operação para auxiliar na utilização do sistema.
Transição
Refine o protótipo. Coloque a aplicação em produção após os testes dos
usuários, convertendo os dados existentes. Efetue quaisquer modificações
necessárias.
Armazenando Informações
Toda organização possui necessidades de informação. Uma biblioteca mantém uma
lista de sócios, livros, datas de entrega e multas. Uma empresa precisa armazenar
informações sobre empregados, departamentos e salários. Estes pedaços de informação
são chamados de dados.
Organizações podem armazenar dados em várias mídias e em formatos diferentes. Por
exemplo, uma cópia física de um documento pode estar armazenada em um arquivo, ou
em dados armazenados em planilhas eletrônicas ou em bancos de dados.
Um banco de dados é um conjunto organizado de informações.
Para administrar um banco de dados, você precisa de sistemas de gerenciamento de
banco de dados (SGDB). Um SGDB é um programa que armazena, recupera, e modifica os
dados sempre que solicitado. Existem quatro tipos principais de bancos de dados:
hierárquico, de rede, relacional, e mais recentemente relacional de objeto.
Modelos de Dados
O objetivo é produzir um modelo que reúna vários destes propósitos e que possa ao
mesmo tempo ser entendido por um usuário final e conter detalhes suficientes para um
desenvolvedor construir um sistema de banco de dados.
Modelo Entidade-Relacionamento
Modelo ER
Em um sistema efetivo, os dados são divididos em categorias ou entidades distintas.
Um modelo entidade-relacionamento (ER) é uma ilustração de várias entidades em um
negócio e as relações entre elas. Um modelo ER é derivado de especificações empresariais
ou narrativas e construído durante a fase de análise do ciclo de vida do desenvolvimento
de sistemas. Modelos ER separam as informações necessárias por um negócio a partir das
atividades executadas dentro deste. Embora as empresas possam mudar suas atividades, o
tipo de informação tende a permanecer constante. Portanto, as estruturas de dados
também tendem a ser constantes.
Benefícios do Modelo ER
Informação de documentos para a organização em um formato claro, preciso
Provê um quadro claro do escopo de exigência de informação
Provê um mapa facilitador para o design do banco de dados
Componentes Chaves
Entidade: algo que possui significado sobre o qual informações precisam ser
conhecidas. Exemplos: contratos, clientes, departamentos, empregados e
pedidos.
Atributo: descreve ou qualifica uma entidade. Por exemplo, para a entidade de
contrato, os atributos seriam o número do contrato, a data de compra,
desconto, total e assim por diante. Cada um dos atributos pode ser requerido
ou opcional. Este estado é chamado obrigatoriedade.
Relacionamento: associação nomeada entre entidades mostrando a
obrigatoriedade e grau. Exemplos: clientes e contratos; empregados e
departamentos; pedidos e itens.
Atributos
Para representar um atributo em um modelo, siga as seguintes convenções:
Utilize nomes no singular em minúsculo.
Marque os atributos que compõe o identificador único principal da entidade
com um símbolo #
Marque atributos obrigatórios, ou valores que devem ser conhecidos, com um
asterisco: *
Marque atributos opcionais, ou valores que podem ser conhecidos, com o
símbolo o
Relacionamentos
Cada lado da relação contém:
Um nome. Por exemplo: ensinado por ou designado para
Uma obrigatoriedade: deve ser ou pode ser
Um grau: ambos um e somente um ou um dos lados um ou mais
Cada entidade de origem {pode ser | deve ser} nome da relação {um e somente um |
um ou mais} entidade de destino.
Identificadores Únicos
Um identificador único (UID) é qualquer combinação de atributos ou relações, ou
ambos, que servem para distinguir ocorrências distintas de uma mesma entidade. Cada
ocorrência da entidade deve ser exclusivamente identificada.
Marque cada atributo que é parte do UID com o símbolo: #
Marque UIDs secundários com o símbolo entre parênteses: (#)
Um banco de dados relacional pode conter uma ou muitas tabelas. Uma tabela é uma
estrutura básica de armazenamento em um SGDB. Uma tabela armazena todos os dados
necessários sobre algo no mundo real, por exemplo: empregados, faturas ou clientes.
A figura acima mostra o conteúdo da tabela TCONTRATOS. Os números indicam o
seguinte:
1. Linha ou tupla representando todos os dados necessários para um único
contrato. Cada linha de uma tabela deve ser identificada por uma chave
primária que não permite linhas duplicadas. A ordem das linhas é insignificante;
especifica-se a ordem das linhas quando os dados são recuperados.
2. Coluna ou atributo que contém o número do contrato, sendo também a chave
primária. Esta coluna identifica cada contrato da tabela TCONTRATOS. Uma
chave primária deve sempre conter um valor.
3. Coluna que não é um valor chave. Uma coluna representa um tipo de dado em
uma tabela; no exemplo, a data de compra de todos os contratos. A ordem das
colunas é insignificante quando armazenando dados; especifica-se a ordem das
colunas quando os dados são recuperados.
4. Coluna que contém o número do cliente, sendo também uma chave
estrangeira. Uma chave estrangeira é uma coluna que define como uma tabela
Oracle Designer
O Designer é uma ferramenta de altíssima produtividade para o desenvolvimento de
aplicações em equipes. Um poderoso repositório compartilhado associado a diagramas
gráficos permitem a criação de complexos aplicativos automaticamente gerados para
diversas linguagens. Tudo isto sem a necessidade da codificação manual e com altos
índices de produtividade, redução de custos e tempo de desenvolvimento.
Oracle Developer
Ferramenta de quarta geração, multiplataforma para o desenvolvimento rápido de
aplicações cliente / servidor e Internet. Orientação a Objetos, múltiplos ambientes e
altíssima integração com bancos de dados permitem a construção de aplicações robustas
e escaláveis de forma simultânea tanto para ambiente Web quanto Cliente / Servidor.
Produtos Oracle
Conheça toda alinha de produtos e serviços da Oracle em:
http://www.oracle.com
Oracle12c:
Introduz uma nova arquitetura multitenant que é uma arquitetura em que uma única
instância do software do banco de dados atende a vários clientes (bancos de dados).
Esta arquitetura permite consolidar vários bancos de dados de forma rápida e permite
gerenciá-los como um serviço de nuvem (cloud – daí o “c” da versão).
O Oracle12c também traz o processamento de dados in-memory, provendo
capacidades de entrega e desempenho analítico avançado.
Inovações adicionais do banco de dados oferecem novos níveis de eficiência,
segurança, performance e disponibilidade.
Solução Oracle
O principal produto da Oracle é o seu sistema de gerenciamento de banco de dados,
incluindo o Servidor Oracle e várias ferramentas com o objetivo de auxiliar os usuários na
manutenção, monitoramento, e uso dos dados. O dicionário de dados Oracle é um dos
componentes mais importantes do Servidor. Consiste em um conjunto de tabelas e visões
que proveem uma referência somente de leitura para o banco de dados.
O SGDB administra tarefas como as seguintes:
Administração do armazenamento e definição dos dados
Controla e restringe o acesso aos dados e a concorrência
Provê procedimentos de cópia e restauração dos dados
Interpreta comandos SQL e PL/SQL
Nota: PL/SQL é uma linguagem procedural desenvolvida pela Oracle que estende as
definições do SQL adicionando-lhe lógica de aplicação.
Comandos SQL e PL/SQL são utilizados por todos os programas e usuários para
acessar e manipular dados armazenados no banco de dados Oracle. Utilizando programas
aplicativos é possível ter acesso ao banco de dados sem utilizar SQL ou PL/SQL
diretamente, porque você pode apertar um botão ou selecionar um “check box”, por
exemplo, mas os aplicativos implicitamente utilizam SQL ou PL/SQL para executar sua
solicitação.
O SQL Developer é uma nova ferramenta disponibilizada pela Oracle que interpreta
comandos SQL e PL/SQL para serem executados no servidor. Trata-se de uma ferramenta
gráfica que torna mais amigável a utilização, bem como o gerenciamento de dados do
banco de dados.
SQL*Plus, por sua vez, é uma ferramenta Oracle em modo texto que interage com o
banco de dados em mais baixo nível, sem qualquer formatação e tratamento dos dados e
possui sua própria linguagem de comandos.
A Oracle oferece também uma enorme variedade de interfaces gráficas de usuário
(GUI) em ferramentas voltadas para a construção de aplicações empresariais como
também um grande conjunto de softwares aplicativos para muitas áreas de negócio e
indústrias.
Comandos SQL
Comando Descrição
Exercícios – 1
2. Executar o PuTTY:
Host Name (or IP address): 10.0.10.30 – open
Login as: oracle
Password: oracle
5. Executar o script que cria o usuário: o nome do usuário será distribuído pelo
instrutor; a senha é igual ao nome do usuário informado:
SQL> @criausuario;
SQL> @setup;
SQL> disco
SQL> exit
2. Introdução ao comando
SELECT
Objetivos
Listar as características do comando SQL SELECT;
Executar um comando SELECT básico;
Conhecer o Oracle SQL Developer;
Conhecer o SQL*Plus.
Sintaxe:
SELECT: palavra chave do comando: lista de uma ou mais colunas ou
expressões;
DISTINCT: comando que unifica linhas repetidas;
*: coringa que indica todas as colunas de uma determinada tabela;
column: nome da coluna selecionada;
expression: expressão aritmética, concatenação de strings ou valores literais;
column alias: título diferente para a uma determinada coluna;
FROM: palavra chave para tabelas;
table: nome da tabela origem dos dados;
table alias: título diferente para uma tabela.
SELECT *
FROM tclientes;
Expressões Aritméticas
Crie expressões em dados tipo NUMBER e DATE utilizando operadores aritméticos
Você pode precisar modificar a forma como os dados são exibidos, por exemplo,
executando cálculos. Isto é possível através do uso de expressões aritméticas. Uma
expressão aritmética pode conter nomes de colunas, valores numéricos constantes, e os
operadores aritméticos.
Operadores Aritméticos
A figura acima mostra os operadores aritméticos disponíveis em SQL. Você pode usar
os operadores aritméticos em qualquer cláusula de um comando SQL, exceto a cláusula
FROM.
2. + -
No exemplo acima, devido ao uso dos parênteses a adição recebe prioridade sobre a
multiplicação, porque primeiro serão resolvidos os parênteses (de dentro para fora) e as
operações dentro dos parênteses seguem a regra de prioridades.
Nota: no SQL Developer os campos com valores nulos são mostrados com (null), mas
isto é mera formatação da ferramenta. No banco de dados, estes valores não existem.
Operador de Concatenação
Você pode unir colunas com outras colunas, expressões aritméticas ou valores
constantes para criar uma expressão de caracteres usando o operador de concatenação
(||). Colunas em qualquer lado do operador são combinadas para fazer uma única coluna
de saída.
Exemplo:
Linhas Duplicadas
A menos que você indique o contrário, o SQL*Plus exibe os resultados de uma
consulta sem eliminar as linhas duplicadas.
O exemplo acima exibe todas as cidades da tabela de clientes. Observe que algumas
são repetidas.
SQL e SQL*Plus
SQL é uma linguagem de comandos para comunicação com o Servidor Oracle a partir
de qualquer ferramenta ou aplicação. O SQL Oracle possui muitas extensões. Quando você
entra um comando SQL, este é armazenado em uma área de memória chamada de SQL
buffer e permanece lá até que você entre um novo comando.
SQL*Plus é uma ferramenta Oracle que reconhece e submete comandos SQL ao
Servidor Oracle para execução e contém sua própria linguagem de comandos.
Características do SQL
Pode ser usado por uma grande variedade de usuários, inclusive por aqueles
com pouca ou nenhuma experiência em programação;
É uma linguagem não procedural;
Reduz a quantidade de tempo necessária para criar e manter sistemas;
É facilmente interpretado em tradução livre do idioma inglês para o português.
Características do SQL*Plus
Está baseado no padrão SQL ANSI Interface proprietária Oracle para executar
(American National Standards Institute) comandos SQL
Comandos armazenados no SQL buffer Uma linha de cada vez; não são armazenados no
em uma ou mais linhas SQL buffer
Utiliza funções para executar algumas Utiliza comandos para formatar os dados
formatações
SQL*Plus
SQL*Plus é um ambiente no qual você pode fazer o seguinte:
Executar comandos SQL para recuperar, modificar, adicionar e remover dados
do banco de dados.
Formatar, executar cálculos, armazenar e imprimir o resultado de consultas na
forma de relatórios.
Criar arquivos com scripts para armazenar comandos SQL para uso repetitivo
no futuro.
Categoria Propósito
Ambiente
Afetam o comportamento geral dos comandos SQL na sessão
Manipulação de
Salvam, carregam e executam arquivos de script
Arquivos
Execução
Enviam comandos SQL a partir do SQL buffer para o Servidor Oracle
Diversos
Existem vários comandos para conectar ao banco de dados,
manipular o ambiente do SQL*Plus e mostrar as definições de colunas
Tabela 2-2: Tipos de comandos do SQL*Plus
SQL Developer
SQL Developer é um ambiente no qual você pode fazer o seguinte:
Executar comandos SQL para recuperar, modificar, adicionar e remover dados
do banco de dados.
Utilizar a edição rápida de resultados;
Formatar, executar cálculos, armazenar e imprimir o resultado de consultas na
forma de relatórios.
Criar arquivos com scripts para armazenar comandos SQL para uso repetitivo
no futuro.
sqlplus [nomeusuario[/senha[@database]]]
No comando:
nomeusuario é o nome do seu usuário no banco de dados.
senha é sua senha no banco de dados; se colocada na linha de comando, ela
estará visível.
@database é a string de conexão para o banco de dados.
Propriedade Descrição
Network Alias (Para STRING de Conexão com o banco de dados definido no arquivo
connection type = TNS) TNSNAMES.ORA
Nome do Serviço
Service Name
Na sintaxe:
nomeobjeto é o nome de um objeto existente: tabela, visão, sinônimo, procedures
e
functions.
O exemplo abaixo exibe informações sobre a estrutura da tabela TCLIENTES.
No resultado:
Nulo? - indica quando uma coluna deve conter dados; NOT NULL indica que a coluna
é obrigatória.
Tipo - mostra o tipo de dado da coluna.
Tipos de Dados
Os tipos de dados estão descritos na tabela seguinte:
Data e hora (dia, mês, ano, hora, minuto e segundo) incluindo o século
DATE entre 1 de Janeiro de 4712 A.C. e 31 de dezembro de 9999 D.C. O formato
default de apresentação de data é definido pelo parâmetro
NLS_DATE_FORMAT (por exemplo: DD/MM/YY).
Comando Descrição
Exercícios – 2
1. Inicie a sessão do SQL Developer criada neste capítulo.
4. Faça uma query que selecione as colunas nome, preço e desconto da tabela
TCURSOS. Coloque o título da coluna DESCONTO como "Desconto
Promocional".
8. Crie uma consulta para exibir o id, data de compra, desconto e o total para cada
contrato, mostrando o id do contrato por primeiro.
3. Restringindo e Ordenando
Dados
Objetivos
Limitar as linhas recuperadas por uma consulta;
Ordenar as linhas recuperadas por uma consulta.
Na sintaxe:
Exemplo:
Operadores de Comparação
Exemplos
Operador BETWEEN
SELECT nome, preco
FROM tcursos
WHERE preco BETWEEN 800 and 1100;
Operador IN
O exemplo acima exibe id, nome e cidade dos clientes pertencentes aos estados 'RS',
'RJ', 'SP' e 'PR' .
O operador IN pode ser utilizado com qualquer tipo de dado. O exemplo a seguir
recupera uma linha a partir da tabela TCLIENTES para cada clientes com seu id listado na
cláusula WHERE.
Nota: Se forem utilizadas strings de caractere ou datas na lista, estas devem estar
entre aspas simples (').
Operador LIKE
Às vezes você pode não saber o valor exato a pesquisar. Você pode então selecionar
linhas que combinem com um padrão de caracteres utilizando o operador LIKE. Podem ser
utilizados dois símbolos para construir a string de procura.
Símbolo Descrição
Exemplo:
SELECT nome
FROM tclientes
WHERE nome LIKE 'A%';
O comando SELECT acima recupera o nome dos clientes da tabela TCLIENTES para
qualquer nome de cliente que começa com um “A”. Observe que os nomes que começam
com um “a” minúsculo não serão recuperados.
Exemplo:
SELECT nome
FROM tclientes
WHERE (nome LIKE '%A%') or (nome LIKE '%a%');
O comando SELECT acima recupera o nome dos clientes da tabela TCLIENTES para
qualquer nome de cliente que começa possua a letra “A” ou “a” em qualquer posição.
A Opção ESCAPE
Quando você precisar de uma comparação exata para os caracteres "%" e "_", utilize a
opção de ESCAPE. Para exibir os nomes de clientes cujo nome contém "a_B", utilize o
seguinte comando SQL:
SELECT nome
FROM tclientes
WHERE nome LIKE '%a\_B' ESCAPE '\';
Operador IS NULL
O operador IS NULL testa os valores que são nulos. Um valor nulo é um valor que é
indisponível, não atribuído, desconhecido ou inaplicável. Portanto, você não pode testá-
los com (=) porque um valor nulo não pode ser igual ou diferente de qualquer valor. O
exemplo acima recupera o nome de todos os cursos que não possuem pré-requisitos.
Operadores Lógicos
Operador AND
No exemplo, ambas as condições devem ser verdadeiras para qualquer registro a ser
selecionado. Portanto, um contrato que tem o total >= R$1000 e possua desconto será
selecionado.
Todas as pesquisas do tipo caractere fazem distinção entre maiúsculas e minúsculas.
Operador OR
No exemplo, para um registro ser selecionada basta que uma das duas condições seja
verdadeira. Portanto, um contrato possui desconto ou tem valor total maior ou igual a
R$1000 será selecionado.
Operador NOT
NOT
FALSE TRUE NULL
Nota: O operador NOT também pode ser utilizado com outros operadores SQL como
BETWEEN, LIKE e NULL.
Regras de Precedência
Ordem de Descrição
precedência
1 Operadores aritméticos
2 Operador de Concatenação
3 Condições de Comparação
4 IS [NOT] NULL, LIKE, [NOT] IN
5 [NOT] BETWEEN
6 NOT EQUAL TO
7 NOT condição lógica
8 AND condição lógica
9 OR condição lógica
Figura 3-4: Regras de precedência dos operadores
Nota: Você pode utilizar parênteses para sobrepor a regra de precedência.
Exemplo:
No exemplo, a precedência é:
1. preço < 750
2. preço > 1500
3. pre_requisito IS NULL
TargetTrust Treinamento e Tecnologia 87
Restringindo e Ordenando Dados
4. Operador AND
5. Operador OR
No exemplo, a precedência é:
1. Resolver o conteúdo dos parênteses.
a. preço < 750
b. preço > 1500
Operador OR
c.
2. Pré-requisito IS NULL
3. Operador AND
Cláusula ORDER BY
SELECT expr
FROM table
[WHERE condição(s)]
[ORDER BY {coluna | expressão | alias} [ASC | DESC], ...}];
Onde:
ORDER BY: especifica a ordem na qual as linhas recuperadas serão exibidas.
ASC: ordena as linhas em ordem ascendente. Esta é a ordenação padrão.
DESC: ordena as linhas em ordem descendente.
Se a cláusula ORDER BY não for utilizada, a ordem em que as linhas serão recuperadas
é indefinida, e o Servidor Oracle pode não recuperar as linhas duas vezes na mesma
ordem para a mesma consulta. Utilize a cláusula ORDER BY para exibir as linhas em uma
ordem específica.
Ainda é possível realizar a ordenação começando pelos valores nulos ou terminando
pelos valores nulos: NULLS FIRST e NULLS LAST.
TargetTrust Treinamento e Tecnologia 90
Restringindo e Ordenando Dados
Você pode utilizar um alias de coluna na cláusula ORDER BY. O exemplo acima ordena
os dados pelo total do contrato (alias VALOR).
Você pode ordenar pela posição numérica da coluna na cláusula SELECT na cláusula
ORDER BY. O exemplo acima ordena os dados pelo id do contrato (Primeira coluna).
Resultado
Você pode ordenar os resultados das consultas por mais de uma coluna.
Na cláusula ORDER BY, especifique as colunas separando-as por vírgulas. Se você
quiser inverter a ordem de uma coluna, especifique DESC depois de seu nome. Você pode
ordenar por colunas que não estão incluídas na lista da cláusula SELECT.
No exemplo, ordenamos todos os clientes da tabela TCLIENTES pelo estado em ordem
crescente e depois pelo nome em ordem decrescente (primeira coluna que aparece na
cláusula SELECT).
Exercícios – 3
1. Inicie uma sessão do SQL Developer.
3. Crie uma consulta para exibir o nome, endereço, cidade, cep e telefone do
cliente com o id 140.
4. Crie uma consulta para exibir o id, dt_compra, desconto e total dos contratos
(tabela tcontratos) para todos os contratos cuja total não está na faixa de 2000
à 5000.
Objetivos
Conhecer os vários tipos de funções single row disponíveis em SQL;
Utilizar funções do tipo caractere, numéricas e de datas em comandos SELECT;
Conhecer o uso de funções de conversão;
Conhecer as expressões de condição.
Você pode utilizá-las nas cláusulas SELECT, WHERE, HAVING e ORDER BY. Você pode
também aninhar funções.
Na sintaxe:
function_name: é o nome da função.
column: é qualquer coluna nomeada do banco de dados.
expression: é qualquer string de caractere ou expressão calculada.
arg1, arg2: são quaisquer argumentos a serem utilizadas pela função.
Funções single-row
Funções de Caracteres
Função Propósito
CONCAT (column1|expression1,
Concatena a primeira string de caracteres com a
column2|expression2)
segunda. Equivalente ao operador de concatenação ( || )
LPAD (column|expression, n, 'string') Retorna uma string com tamanho total de n alinhada à
direita
REPLACE
Procura a string search_string em x e substitui por
(x,search_string,replace_string)
replace_string
Função Resultado
LOWER('Introdução ORACLE 10g') introdução oracle 10g
UPPER('Introdução ORACLE 10g') INTRODUÇÃO ORACLE 10G
INITCAP('Introdução ORACLE 10g') Introdução Oracle 10g
Tabela 4-2: Funções de conversão entre maiúsculas/minúsculas
O exemplo acima não retorna nenhuma linha porque não existe nenhum cliente com o
nome = „CARLOS MAGNO‟ em letras maiúsculas.
Função Resultado
CONCAT('Introdução ORACLE 12c',' Curso 1') Introdução ORACLE 12c Curso 1
SUBSTR('Introdução ORACLE 12c',1,11) Introdução
LENGTH('Introdução ORACLE 12c') 21
INSTR('Introdução ORACLE 12c','ORACLE') 12
LPAD('Introdução ORACLE 12c',30,'*') *********Introdução ORACLE 12c
RPAD('Introdução ORACLE 12c',30,'*') Introdução ORACLE 12c*********
REPLACE('Introdução ORACLE 11g','11g','12c') Introdução ORACLE 12c
TRIM(';' FROM 'nome@gmail.com;') nome@gmail.com
RTRIM('nome@gmail.com;', ';') nome@gmail.com
LTRIM(' nome@gmail.com', ' ') nome@gmail.com
Tabela 4-3: Funções de manipulação de caracteres
O exemplo acima exibe o nome do cliente, a string „UF-‟ concatenado com o estado, o
tamanho do nome do cliente e a posição numérica da letra A no nome, para todos os
clientes que possuem a string „Porto‟ nas 5 primeiras posições do campo CIDADE da
tabela TCLIENTES.
Funções Numéricas
Função Propósito
A função MOD encontra o resto da divisão do valor 1 pelo valor 2. O exemplo acima
calcula o resto da divisão do total pelo desconto dos contratos que possuam desconto
válido.
SYSDATE
SYSDATE é uma função de data que retorna a data e hora atual. Você pode utilizar
SYSDATE da mesma maneira que você utiliza qualquer outro nome de coluna. Por
exemplo, você pode exibir a data atual selecionando SYSDATE a partir de uma tabela. É
habitual selecionar SYSDATE a partir de uma tabela dummy chamada DUAL.
DUAL
A tabela DUAL pertence ao usuário SYS e pode ser acessada por todos os usuários.
Contém uma coluna, DUMMY, e uma linha com o valor X. A tabela DUAL é útil quando
você quer retornar um valor uma única vez, podendo este valor ser uma constante,
pseudocoluna ou expressão que não são derivadas de uma tabela com dados de usuário.
Exemplo:
Mostre a data corrente utilizando a tabela DUAL.
SELECT SYSDATE
FROM dual;
O exemplo acima exibe o nome e o número de semanas de vida dos clientes com o
estado igual a „SP‟. Ele subtrai a data atual (SYSDATE) a partir da data na qual o cliente
nasceu e divide o resultado por 7 para calcular o número de semanas.
Nota: SYSDATE é uma função SQL que retorna a data e hora atual. Seus resultados
podem diferir do exemplo.
Funções de Data
Função Resultado
MONTHS_BETWEEN('01/01/05','01/01/04') 12
ADD_MONTHS('01/01/05',6) 01/07/05
NEXT_DAY('01/01/05','DOMINGO') 02/01/05
LAST_DAY('01/01/05') 31/01/05
Tabela 4-6: Funções de data
Exemplo:
Para todos os clientes que nasceram a menos de 400 meses, selecione o número do
cliente, a data de nascimento, o número de meses vividos, a data precisa após 6 meses do
nascimento deste cliente, a primeira sexta-feira após a data de nascimento e o último dia
do mês do cliente.
SELECT MONTHS_BETWEEN('01/01/05','01/01/04'),
ADD_MONTHS('01/01/05',6),
NEXT_DAY('01/01/05','DOMINGO'),
LAST_DAY('01/01/05')
FROM dual;
Função Resultado
ROUND(TO_DATE('25/07/05'),'MONTH') 01/08/05
ROUND(TO_DATE('25/07/05'),'YEAR') 01/01/06
TRUNC(TO_DATE('25/07/05'),'MONTH') 01/07/05
TRUNC(TO_DATE('25/07/05'),'YEAR') 01/01/05
Tabela 4-7: Funções de data
Função Resultado
TRUNC(sysdate,‟DAY‟) Data do dia com a hora zero
TRUNC(sysdate) Data do dia com a hora zero
As funções ROUND e TRUNC podem ser utilizadas para valores numéricos e de data.
Quando utilizadas com datas, elas arredondam ou truncam para o modelo de formato
especificado. Portanto, você pode arredondar datas para o mais próximo ano ou mês.
Exemplo:
Compare as datas de nascimento para todos os clientes que nasceram em 1971.
Mostre o número do cliente, a data de nascimento e o mês as funções ROUND e TRUNC.
Funções de Conversão
Além dos tipos de dados Oracle, as colunas de uma tabela no banco de dados
Oracle12c podem ser definidas utilizando tipos de dados ANSI, DB2, etc. Entretanto, o
Servidor Oracle internamente converte tais tipos de dados para tipos de dados Oracle12c.
Em alguns casos, o Servidor Oracle permite dados de um determinado tipo onde ele
esperava dados de um tipo diferente. Isto é permitido porque o Servidor Oracle pode
converter os dados automaticamente para o tipo de dado esperado. Esta conversão de
tipo de dado pode ser feita implicitamente pelo Servidor Oracle ou explicitamente pelo
usuário.
Conversões implícitas de tipo de dado ocorrem de acordo com as regras apresentadas
a seguir.
Conversões explícitas de tipo de dado são feitas utilizando as funções de conversão.
As funções de conversão convertem um valor de um tipo de dado para outro.
Nota: Embora a conversão de tipo de dado implícita esteja disponível, é recomendado
que você faça a conversão explícita para assegurar confiabilidade de seus comandos SQL.
A atribuição tem sucesso se o Servidor Oracle puder converter o tipo de dado do valor
utilizado na atribuição para o tipo de dado do destino da atribuição.
Para a avaliação de uma expressão, o Servidor Oracle pode converter
automaticamente o seguinte:
VARCHAR2 ou CHAR para NUMBER
TargetTrust Treinamento e Tecnologia 120
Funções Single Row, Funções de Conversão e Expressões de Condição
Em geral, o Servidor Oracle utiliza a regra para expressões quando uma conversão de
tipo de dado é necessária e a regra de conversão em atribuições não pode ser aplicada.
Nota: Conversões de CHAR para NUMBER só tem sucesso se a string de caracteres
representa um número válido.
O SQL provê três funções para converter um valor de um tipo de dado para outro.
Função Propósito
Elemento Descrição
CC Século;
YYYY Ano com 4 dígitos
YYY ou YY ou Y Últimos 3, 2 ou 1 dígito(s) do ano
Y,YYY Ano com símbolo de milhar na posição da “,”
BC ou AD Indicador AC / DC
B.C. ou A.D. Indicador AC / DC com pontos
Q Quarto do ano
MM Valor do mês com dois dígitos
Nome do mês com brancos para completar o tamanho de 9
MONTH
caracteres
MON Nome do mês abreviado com três letras
RM Número do mês em Romano
WW ou W WW = Numero da semana do ano, W = numero da semana do mês
DDD ou DD ou D Dia do ano, mês ou dia da semana
DAY Nome do dia com brancos para completar o tamanho de 9 caracteres
DY Nome do dia abreviado com três letras
Tabela 4-9: Elementos de formatação de data
Formatos de Hora
Utilize os formatos listados na tabela abaixo para exibir informações de hora e literais
e para mudar números para números soletrados.
Elemento Descrição
AM ou PM Período
HH ou HH12 ou HH ou HH12 = Hora (1–12) ou HH24 = hora (0–23)
HH24
MI Minuto (0–59)
SS Segundo (0–59)
SSSSS Segundos decorridos desde à meia noite (0–86399)
Tabela 4-10: Formatos de hora
Outros Formatos
Elemento Descrição
TO_CHAR(number, 'fmt')
Quando trabalhar com valores numéricos como se fossem strings de caractere, você
deve converter esses números para o tipo de dado caractere utilizando a função TO_CHAR
que traduz um valor do tipo de dado NUMBER para o tipo de dado VARCHAR2. Esta
técnica é especialmente útil em concatenações.
Elemento Descrição
Posição numérica (o número de 9s determina o tamanho da
9
exibição)
0 Complementa com zeros a partir da posição especificada
$ Indicador de dólar flutuante
Símbolo flutuante da moeda local (Conforme especificação do
L
parâmetro NLS_CURRENCY).
Símbolo decimal na posição especificada (conforme
D
especificação do parâmetro NLS_NUMERIC_CHARACTER)
Símbolo de milhar na posição especificada (conforme
G
especificação do parâmetro NLS_NUMERIC_CHARACTER)
MI Sinal de menos à direita (valores negativos)
PR Números negativos entre parênteses
EEEE Notação científica (o formato deve especificar quatro Es)
Função Resultado
TO_CHAR(1234,'999999') 1234
TO_CHAR(1234,'099999') 001234
TO_CHAR(1234,'$999999') $1234
TO_CHAR(1234,'L999999') R$1234
TO_CHAR(1234,'9999D99') 1234,00
TO_CHAR(1234,'999G999') 1.234
TO_CHAR(-1234,'999999MI') 1234-
TO_CHAR(-1234,'999999PR') <1234>
TO_CHAR(1234,'999999EEEE') 1E+03
Diretrizes
O Servidor Oracle exibe uma string com o caractere (#) ao invés de um número
quando o número de dígitos exceder o número de dígitos providos pela
máscara.
O Servidor Oracle arredonda o valor decimal armazenado para o número de
espaços decimais providos pela máscara.
TO_NUMBER(char)
TO_DATE(char[, 'fmt'])
Você pode querer converter uma string de caracteres para um número ou uma data.
Para realizar esta tarefa, você utiliza as funções TO_NUMBER e TO_DATE. A máscara que
você pode escolher baseia-se nos elementos de formato apresentados anteriormente.
Exemplo:
Mostre os nomes e as datas de nascimento de todos os clientes que nasceram em 05
de Fevereiro de 1969 („Fevereiro 05, 1969‟).
CAST(x AS type)
Você pode usar a função CAST para converter x para um tipo de dado compatível
especificado por type.
Exemplo:
Para De
BINARY_ CHAR NUMBER DATE RAW ROWID NCHAR
FLOAT VARCHAR2 TIMESTAMP UROWID NVARCHAR2
BINARY_ INTERVAL
DOUBLE
BINARY_ X X X X
FLOAT
BINARY_
DOUBLE
CHAR X X X X X X
VARCHAR2
NUMBER X X X X
DATE X X
TIMESTAMP
INTERVAL
RAW X X
BINARY_ X X
ROWID
UROWID
NCHAR X X X X X X
NVARCHAR2
Função NVL
NVL(desconto,0)
NVL(dt_nascimento,'01/01/70')
NVL(nome,'Nome não cadastrado!')
Para converter um valor nulo para outro valor do mesmo tipo, utilize a função NVL
NVL(expr1, expr2)
Sintaxe:
Onde:
expr1: é o valor ou expressão de origem que pode conter nulo.
expr2: é o valor de destino utilizado quando o valor de origem for nulo.
Você pode utilizar a função NVL para converter qualquer tipo de dado, porém, o valor
de retorno deve sempre ser do mesmo tipo de dado do parâmetro expr1.
Função NVL2
Podemos utilizar como alternativa a função NVL2, onde definimos também um valor
para quando o valor ou expressão de origem conter nulo. Para converter um valor nulo
para outro valor do mesmo tipo, utilize a função NVL2.
Sintaxe:
Onde:
expr1: é o valor ou expressão de origem que pode conter nulo.
expr2: é o valor caso expr1 não seja nula.
expr3: é o valor de destino utilizado quando o valor de origem for nulo.
Onde:
NULLIF compara as expressões (expr1 e expr2). Se elas são iguais, então a
função retorna nulo. Se elas são diferentes, então a função retorna expr1.
Obs.: Você não pode especificar NULL para expr1.
A função NULLIF é logicamente equivalente a seguinte expressão CASE:
CASE
WHEN expr1 = expr 2 THEN NULL
ELSE expr1
END
Exemplo:
SELECT id, desconto, total * 0.2, NULLIF (desconto, total * 0.2) RESULTADO
FROM tcontratos;
Onde:
COALESCE retorna a primeira expressão diferente de nulo na lista de expressões.
Você deve especificar pelo menos duas expressões. Se todas as expressões retornarem
nulo, então a função retorna nulo.
Exemplo:
CASE expr
WHEN expr_comparação1 THEN retorno1
[WHEN expr_comparação2 THEN retorno2
WHEN expr_comparação3 THEN retorno3
ELSE retorno]
END;
Ou
CASE
WHEN expr_comparação1 THEN retorno1
[WHEN expr_comparação2 THEN retorno2
WHEN expr_comparação3 THEN retorno3
ELSE retorno]
END;
O uso de uma expressão envolvendo a cláusula CASE permite uma estrutura do tipo
IF..THEN...ELSE dentro de um comando de SQL sem que tenhamos de usar uma rotina.
SELECT estado, CASE estado WHEN 'RS' THEN 'Rio Grande do Sul'
WHEN 'RJ' THEN 'Rio de Janeiro'
WHEN 'SP' THEN 'São Paulo'
ELSE ' '
END NOME
FROM tclientes;
Neste exemplo analisamos o valor retornado pela coluna ESTADO e de acordo com o
conteúdo retornamos informações diferentes linha a linha. Esta sintaxe é similar ao uso do
DECODE; no entanto, podemos usar uma segunda forma sintática que elimina a
necessidade da comparação e na qual podemos definir diversas condições diferentes.
Função DECODE
DECODE(coluna/expressão, arg1, result1
[, arg2, result2,...,]
[, default])
Aninhando Funções
Exercícios – 4
1. Conecte-se ao banco de dados com o SQL Developer.
2. Escreva uma consulta para exibir a data atual no formato „DD/MM/YYYY
HH24:MI:SS‟. Coloque o alias de coluna como “Data”. Execute a consulta.
3. Mostre o id do curso, o código Target (cod_trg), o preço e o preço com um
aumento de 15%. Selecione somente os cursos que possuam o número 1 em
qualquer parte do id. Coloque o alias da coluna como “Novo Preço”. Execute a
consulta.
4. Altere a consulta anterior para adicionar uma nova coluna que subtraia o preço
antigo do novo preço. Coloque o alias da coluna como “Aumento”. Execute a
consulta.
5. Mostre o nome de cada cliente e calcule o número de meses entre a data atual e a
data de nascimento. Coloque o alias da coluna como “Meses de Vida”. Ordene o
resultado pelo número de meses. Arredonde o número de meses para o número
inteiro mais próximo. Execute a consulta.
6. Crie uma consulta para exibir o código Target e o preço de todos os cursos.
Formate o preço para exibir como R$1.000,00. Coloque o alias da coluna como
“Valor Curso”. Execute a consulta.
Objetivos
Escrever comandos SELECT para acessar dados 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).
Tabela TCONTRATOS
O que é um Join?
Sintaxe:
Quando dados de mais de uma tabela são requeridos, uma condição de JOIN é
utilizada. Linhas em uma tabela podem ser unidas à linhas em outra tabela de acordo com
valores comuns que existem em colunas correspondentes, que normalmente são colunas
de chaves primárias e estrangeiras.
Para exibir dados de duas ou mais tabelas relacionadas, escreva uma condição de JOIN
simples na cláusula WHERE.
Sintaxe:
tabela.coluna: denota a tabela e coluna a partir da qual os dados são recuperados.
Tabela1.coluna1= tabela2.coluna2 é a condição que une (ou relaciona) as tabelas.
Diretrizes
Quando escrever um comando SELECT que relaciona tabelas, preceda o nome
das colunas com o nome da tabela para obter maior clareza e melhorar o
acesso ao banco de dados.
Se o mesmo nome de coluna existir em mais de uma tabela, o nome de coluna
deve ser prefixado com o nome da tabela.
Para unir n tabelas, você precisa de um mínimo de (n-1) condições de join.
Portanto, para unir quatro tabelas, um mínimo de três joins são necessários.
Esta regra pode não se aplicar se a tabela possuir uma chave primária
composta. Neste caso mais de uma coluna é necessária para identificar cada
linha de forma exclusiva.
Produto Cartesiano
Quando uma condição de JOIN é inválida ou completamente omitida, o resultado é
um produto cartesiano no qual serão exibidas todas as combinações das linhas. Todas as
linhas da primeira tabela são unidas a todas as linhas da segunda tabela.
Um produto cartesiano tende a gerar um número grande de linhas, e seu resultado é
raramente útil. Você sempre deveria incluir uma condição de JOIN válida na cláusula
WHERE, a menos que você tenha uma necessidade específica para combinar todos os
registros de todas as tabelas.
Tipos de Joins
O que é um Equijoin?
TCLIENTES.ID
TCONTRATOS.TCLIENTES_ID
Ou
No exemplo acima:
A cláusula SELECT especifica os nomes de coluna a recuperar:
o nome do cliente e o código do cliente são colunas da tabela TCLIENTES.
o número do contrato e o código do cliente que são colunas da tabela
TCONTRATOS.
A cláusula FROM especifica as duas tabelas que o banco de dados deve acessar:
o Tabela TCLIENTES.
o Tabela TCONTRATOS.
A cláusula WHERE especifica como as tabelas serão unidas:
o TCLIENTES.ID = TCONTRATOS.TCLIENTES_ID
Qualificar os nomes de coluna com os nomes de tabela pode consumir muito tempo,
particularmente se os nomes de tabelas forem longos. Você pode utilizar alias de tabela
em vez de nomes de tabela. Da mesma maneira que um alias de coluna fornece outro
nome para uma coluna, um alias de tabela fornece outro nome para uma tabela. Alias de
tabela ajudam a manter o código SQL menor, utilizando menos memória.
Observe que no exemplo os alias de tabela são identificados na cláusula FROM. O
nome da tabela é especificado por completo, seguido por um espaço e então pelo alias de
tabela. A tabela TCLIENTES recebeu o alias CL, enquanto que a tabela TCONTRATOS
recebeu o alias CO.
Diretrizes:
Alias de tabelas podem ter até 30 caracteres de tamanho, porém, quanto menor
melhor.
Se um alias de tabela for utilizado para um nome de tabela específico na
cláusula FROM, então este alias de tabela deve ser utilizado para substituir o
nome da tabela em todo o comando SELECT.
Alias de tabelas devem ser significativos.
O alias de tabela só é válido para o comando SELECT no qual foi declarado.
Ou
SELECT co.id, co.dt_compra, co.total,
cl.id, cl.nome,
it.seq, it.qtde,
cs.id, cs.nome
FROM tcontratos co
JOIN tclientes cl ON (co.tclientes_id =
cl.id)
JOIN titens it ON (co.id =
it.tcontratos_id)
JOIN tcursos cs ON (it.tcursos_id = cs.id);
Non-Equijoins
Contratos que possuam uma certa faixa de desconto.
Tabela TCONTRATOS
Tabela TDESCONTOS
Uma relação entre a tabela TCONTRATOS e a tabela TDESCONTOS pode ser definida
como um non-equijoin, significando que nenhuma coluna da tabela TCONTRATOS
corresponde diretamente a uma coluna da tabela TDESCONTOS. A relação entre as duas
tabela é a coluna DESCONTO da tabela TCONTRATOS está entre os valores definidos nos
campos BASE_INFERIOR e BASE_SUPERIOR da tabela TDESCONTOS. A relação é obtida
utilizando um operador diferente de igual (=), como por exemplo o operador BETWEEN.
Nota: Outros operadores como „<=‟ e „>=‟ podem ser utilizados, porém o operador
BETWEEN é o mais simples. Lembre-se de especificar o menor valor primeiro e o maior
valor por último quando utilizar o operador BETWEEN. Alias de tabela foram especificados
por razões de desempenho, não por causa de possíveis ambiguidades. Utilizamos a função
NVL para garantir a comparação com valores diferentes de nulo.
Outer Joins
Tabela TCURSOS
Se uma linha não satisfaz a condição de join, esta linha não aparecerá no resultado da
consulta. Por exemplo, na condição de equijoin das tabelas TCURSOS e TITENS, alguns
cursos não foram contratados por nenhum cliente, ou seja, não existem contratos com
itens de determinados cursos.
Ou
Self Joins
Como descobrir os pré-requisitos dos cursos oferecidos?
Às vezes você precisa relacionar uma tabela com ela mesma. Para encontrar os
pré-requisitos de um certo curso você precisa unir a tabela TCURSOS com ela
mesma. A coluna PRE_REQUISITO da table TCURSOS referencia o ID do curso
que é pré-requisito.
Exemplo:
O exemplo acima relaciona a tabela TCURSOS com ela mesma. Para simular duas
tabelas na cláusula FROM, existem dois alias, chamados CURSO e PRE_REQ, para a mesma
tabela, TCURSOS.
Exercícios – 5
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso.
2. Escreva uma consulta para exibir o nome do cliente e os contratos (id e data de
compra) que este cliente possui, ordene por nome em ordem alfabética.
Execute a consulta.
3. Crie uma lista única de todos os contratos que possuem clientes com a letra „A‟
(maiúscula ou minúscula) no nome, ordene por ordem alfabética. Execute a
consulta.
4. Escreva uma consulta para exibir o nome do cliente, id do contrato e total, para
todos os contratos que não possuem desconto (NULO ou ZERO). Execute a
consulta.
5. Crie uma consulta que mostre o nome do cliente, o id e total do contrato, e a
classe de desconto para todos os contratos. Ordene pela classe de desconto.
Execute a consulta.
6. Mostre o id, o código e a data de criação do curso e o id, o código e a data de
criação do seu curso pre_requisito do mesmo para todos os cursos. Execute a
consulta.
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 grupos utilizando a cláusula HAVING.
SELECT max(total)
FROM tcontratos;
Função Descrição
MIN( [DISTINCT | ALL] expr) Valor mínimo de expr, ignorando valores nulos
Você pode utilizar as funções AVG, SUM, MIN e MAX em colunas que podem
armazenar dados numéricos. O exemplo acima exibe a média, o maior, o menor e a soma
dos preços dos cursos.
Você pode utilizar as funções MAX e MIN para qualquer tipo de dado. O exemplo
acima exibe o mais recente e o mais antigo contrato.
Nota: As funções AVG, SUM, VARIANCE e STDDEV só podem ser utilizadas com tipos
de dados numéricos.
SELECT COUNT(desconto)
FROM tcontratos;
Exemplos:
Mostre o número de estados na tabela TCLIENTES.
SELECT COUNT(estado)
FROM tclientes;
SELECT COUNT(DISTINCT(estado))
FROM tclientes;
SELECT AVG(desconto)
FROM tcontratos;
SELECT AVG(NVL(desconto,0))
FROM tcontratos;
Sintaxe:
Expressão_de_grupo: especifica as colunas cujos valores determinam a base para o
agrupamento das linhas.
Diretrizes
Se você incluir uma função de grupo em uma cláusula SELECT, você não pode
selecionar resultados individuais a menos que a coluna individual apareça na
cláusula GROUP BY. Você receberá uma mensagem de erro caso não inclua a
coluna na lista.
Utilizando a cláusula WHERE, você pode excluir linhas antes de fazer a divisão
dos grupos.
Você deve incluir as colunas na cláusula GROUP BY.
Você não pode utilizar o alias de uma coluna na cláusula GROUP BY.
Por default, as linhas são classificadas em ordem ascendente das colunas
incluídas na lista da cláusula GROUP BY. Você pode sobrepor esta ordenação
utilizando a cláusula ORDER BY.
Quando utilizar a cláusula GROUP BY, tenha certeza que todas as colunas da lista da
cláusula SELECT que não estão em funções de grupo estejam na lista da cláusula GROUP
BY. O exemplo acima exibe o número do cliente e a média do total de cada contrato.
O comando SELECT acima, contendo uma cláusula GROUP BY, é avaliado:
A cláusula SELECT especifica as colunas a serem recuperadas:
o A coluna contendo o número do cliente da tabela TCONTRATOS.
o A média de todos os totais no grupo especificado na cláusula GROUP BY.
A cláusula FROM especifica as tabela que o banco de dados deve acessar:
tabela TCONTRATOS.
A cláusula WHERE especifica as linhas a serem recuperadas. Uma vez que não
existe nenhuma cláusula WHERE, por default todas as linhas serão recuperadas.
A cláusula GROUP BY especifica como as linhas devem ser agrupadas. As linhas
estão sendo agrupadas através do número do cliente e, portanto, a função AVG
que está sendo aplicada à coluna total calculará a média do total para cada
contrato.
Desta forma a função SUM está sendo aplicada à coluna de total para todos os
contratos dentro de cada grupo de data de compra por estado.
Cláusula Having
A cláusula WHERE não pode ser utilizada para restringir grupos. O comando SELECT
acima resulta em um erro porque utiliza a cláusula WHERE para restringir a exibição das
médias de totais de contratos por clientes que possuem média de contratos maior que
R$5000.
Você pode corrigir este erro utilizando a cláusula HAVING para restringir grupos.
Você utiliza a cláusula HAVING para especificar quais grupos serão exibidos. Portanto,
você restringe grupos baseado em informações agregadas.
Sintaxe:
Condição_de_grupo: restringe as linhas de grupos retornadas para aqueles grupos
onde a condição especificada retornar TRUE.
O Servidor Oracle executa os seguintes passos quando você utiliza grupos e a cláusula
HAVING:
1. A cláusula WHERE seleciona as linhas.
2. A cláusula GROUP BY forma os grupos.
3. A cláusula HAVING seleciona os grupos.
Exemplo:
O exemplo acima exibe os estados que possuem clientes com idade superior a 40
anos.
SELECT tclientes_id,
AVG(total)
FROM tcontratos
GROUP BY tclientes_id
HAVING MAX(total) > 5000;
O exemplo abaixo exibe os contratos agrupados por clientes onde a diferença entre a
data de compra e a data atual seja inferior a 8 dias (uma semana) e a soma do total destes
contratos seja superior a R$3000.
SELECT MAX(AVG(total))
FROM tcontratos
GROUP BY tclientes_id;
Funções de grupo podem ser aninhadas. O exemplo acima exibe a maior média de
contrato por cliente.
Exercícios – 6
1. Funções de grupo atuam sobre muitas linhas para produzir uma única linha
para cada grupo formado?
2. Funções de grupo incluem nulos nos cálculos?
3. No SQLDeveloper utilize a sua conexão e conecte-se ao banco de dados do
curso. Mostre o maior, o menor, a soma e a média do total de todos os
contratos. Coloque o alias das colunas como "Máximo", "Mínimo", "Soma" e
"Média". Arredonde os resultados com zero dígitos decimais. Execute a
consulta.
4. Modifique a consulta anteriorr para exibir o menor, o maior, a soma e a média
do total para cada estado. Execute a consulta.
5. Escreva uma consulta que mostre a diferença entre o maior e menor contrato.
Coloque o alias da coluna como “DIFERENÇA”. Execute a consulta.
6. Escreva uma consulta para exibir o estado, o número de contratos e a média do
total de contratos para todos os clientes daquele estado. Coloque os alias de
coluna como “UF”, “CONTRATOS”, “MÉDIA”, respectivamente. Execute a
consulta.
7. Variáveis de Substituição e
Variáveis de ambiente do
SQL*Plus
Objetivos
Utilizar variáveis de substituição;
Customizar o ambiente do SQLPlus.
Variáveis de Substituição
Utilizando SQLPlus, você pode criar relatórios que solicitem ao usuário que forneça
seus próprios valores para restringir o intervalo de dados retornados. Para criar relatórios
interativos, você pode embutir variáveis de substituição em um arquivo de comandos ou
em um comando SQL isolado. Uma variável pode ser vista como um recipiente no qual os
valores são armazenados temporariamente.
Sintaxe Descrição
No SQLPlus
Para confirmar as mudanças no comando SQL, utilizar o comando do SQL*Plus SET
VERIFY. Ao executar SET VERIFY ON o SQLPlus passa a exibir o texto de um comando
antes e depois de efetuar a troca das variáveis de substituição pelos valores.
O exemplo acima exibe o antigo como também o novo valor da variável de
substituição id_cliente.
Em uma cláusula WHERE, valores tipo data e caractere devem ser incluídos entre aspas
simples. A mesma regra aplica-se às variáveis de substituição.
Para evitar a necessidade de entrar aspas em tempo de execução, inclua a variável
entre aspas simples dentro do próprio comando SQL.
O exemplo acima apresenta uma consulta para recuperar o nome do cliente, a cidade
e o estado de todos os clientes baseado no nome fornecido pelo usuário no prompt.
Nota: Você também pode utilizar funções como UPPER e LOWER com o (&). Utilize
UPPER('&pestado') de forma que o usuário não tenha que entrar o nome do cliente em
maiúsculas.
Além da cláusula WHERE dos comandos SQL, você pode utilizar as variáveis de
substituição para substituir nomes de coluna, expressões ou texto.
Exemplo:
Exibe o número do cliente, o nome, e o cep e qualquer outra coluna especificada pelo
usuário em tempo de execução, a partir da tabela TCLIENTES. O usuário também pode
especificar a condição para recuperação de linhas e o nome da coluna pela qual os dados
resultantes devem ser ordenados.
Você pode utilizar variáveis de substituição com o símbolo (&&) se você quiser
reutilizar o valor da variável sem solicitá-lo ao usuário cada vez.
O usuário receberá uma única vez o prompt para o valor. No exemplo acima, o usuário
é solicitado a fornecer uma única vez o valor para a variável nome_coluna. O valor
fornecido pelo usuário (estado) é utilizado para exibir e ordenar os dados.
O SQLPlus armazena o valor fornecido utilizando o comando DEFINE; ele o reutilizará
sempre que você referenciar o nome da variável. Se necessário, você pode utilizar o
comando UNDEFINE para apagar uma variável de usuário.
Definindo Variáveis
Você pode predefinir variáveis antes de executar um comando SELECT. O SQL*Plus
provê dois comandos para definir e setar variáveis: DEFINE e ACCEPT.
Se você precisar especificar espaços quando utilizar o comando DEFINE, você deve
colocar os espaços dentro de aspas simples.
Comando Descrição
DEFINE variable = value Cria uma variável de usuário do tipo de dado CHAR e atribui
um valor a ela
O Comando ACCEPT
Sintaxe:
variável: é o nome da variável que armazena o valor. Se ela não existir, o SQL*Plus a
criará.
tipo_de_dado: deve ser NUMBER, CHAR ou DATE. CHAR possui um tamanho máximo
de 240 bytes. DATE é verificado através de um modelo de formato, e o tipo de dado é
CHAR.
FOR[MAT]: especifica a máscara de formatação, por exemplo: A10 ou 9.999.
PROMPT texto: exibe o texto antes de o usuário poder entrar o valor.
HIDE: suprime o que o usuário digita, por exemplo, uma senha.
Quando você remove variáveis, você pode verificar suas mudanças com o comando
DEFINE. Quando você encerra o SQL*Plus, as variáveis definidas durante aquela sessão são
perdidas.
Você pode utilizar o comando DEFINE para criar uma variável e então utilizar esta
variável como você utilizaria qualquer outra variável. O exemplo acima cria uma variável
pestado que contém o valor „RS‟. O comando SQL então utiliza esta variável.
Para mostrar a definição da variável pestado:
DEFINE pestado
UNDEFINE pestado
Sintaxe:
system_variable: é uma variável que controla um aspecto do ambiente da sessão.
value: é um valor para a variável de sistema.
Você pode verificar a configuração atual com o comando SHOW. O comando SHOW
no exemplo acima confere se ECHO estava configurado para ON ou para OFF.
Para ver todos os valores de variáveis SET, utilize o comando SHOW ALL.
FEED[BACK] { 6 | n | OFF | ON} Exibe o número de registros retornados por uma consulta
quando a consulta retorna pelo menos n registros
PAU[SE] {OFF | ON | text} Permite que você controle o scroll do seu terminal (Você
deve pressionar [Return] após visualizar cada pausa)
Exercícios – 7
1. Conecte-se no SQL*Plus.
2. Escreva um arquivo de script para mostrar o código Target, o preço e a data de
criação para todos os cursos que foram criados entre um determinado período.
Concatene o código Target e data de criação, separando-os por uma vírgula e
espaço, e coloque o alias da coluna como “Curso”. Solicite ao usuário os dois
intervalos do período utilizando o comando ACCEPT. Utilize o formato
DD/MM/YYYY. Salve o script para um arquivo chamado e7q1.sql. Execute o
script e7q1.sql.
8. Sub-consultas
Objetivos
Descrever os tipos de problemas que sub-consultas podem resolver;
Definir sub-consultas;
Listar os tipos de sub-consultas;
Escrever sub-consultas do tipo single-row e multiple-row;
Escrever uma sub-consulta multiple-column;
Escrever sub-consultas em uma cláusula FROM.
Suponha você quer escrever uma consulta para encontrar quem tem um contrato com
valor total maior que os contratos do cliente 110.
Problema:
“Quais são os contratos maiores que o maior contrato do cliente 110?”
Para resolver este problema, você precisa de duas consultas: uma consulta para
encontrar o maior valor dos contratos do cliente 110 e uma segunda consulta para
encontrar quem tem contrato maior que este valor.
Você pode resolver este problema combinando as duas consultas e colocando uma
consulta dentro da outra.
Uma consulta interna ou sub-consulta retorna um valor que é utilizado pela consulta
externa ou consulta principal. Utilizar uma sub-consulta é equivalente a executar duas
consultas sequenciais e utilizar o resultado da primeira consulta como o valor de procura
da segunda consulta.
Sub-consultas
Sintaxe:
SELECT select_list
FROM tabela
WHERE expressão operador
( SELECT select_list
FROM tabela);
Onde:
Select_list: Lista de colunas ou expressões
operado: inclui um operador de comparação como >, = ou IN
expressão : Expressão a ser comparada com o resultado do select da sub-consulta
No exemplo acima, a consulta interna determina o maior total dos contratos do cliente
110. A consulta externa recebe o resultado da consulta interna e utiliza este resultado para
exibir todos os contratos que possuem total maior que este valor.
Tipos de Sub-consultas
Sub-consultas Single-Row
Operadores de comparação utilizados com Sub-consultas Single Row.
Uma sub-consulta do tipo single-row retorna uma linha a partir do comando SELECT
interno. O resultado deste tipo de sub-consulta deve ser comparado com uma expressão
utilizando um operador do tipo single-row. A figura acima exibe uma lista dos operadores
single-row.
Exemplo: Mostre os cursos cujo preço seja igual ao preço do curso com ID = 1.
Você pode exibir dados de uma consulta principal utilizando uma função de grupo em
uma sub-consulta para retornar uma única linha. A sub-consulta está entre parênteses e é
colocada após o operador de comparação.
O exemplo acima exibe os contratos que possuem o total maior que a média do total
de todos os contratos da tabela TCONTRATOS. A função de grupo AVG retorna um único
valor (3530,80952) para a consulta externa.
Um erro comum em sub-consultas é mais de uma linha ser retornada para uma sub-
consulta do tipo single-row.
No comando SQL acima, a sub-consulta possui uma cláusula GROUP BY (dt_compra),
que implica que a sub-consulta devolverá múltiplas linhas, uma para cada grupo
encontrado. Neste caso, o resultado da sub-consulta será:
A consulta externa recebe os resultados da sub-consulta e utiliza estes resultados em
sua cláusula WHERE. A cláusula WHERE contém um operador igual (=), operador de
comparação do tipo single-row que compara apenas um valor. O operador (=) não aceita
mais de um valor a partir sub-consulta e consequentemente gera o erro.
Um problema comum com sub-consultas é nenhuma linha ser retornada pela sub-
consulta (consulta interna).
No comando SQL acima, o comando parece estar correto, mas não seleciona nenhuma
linha quando é executado.
O problema é que não existem contratos para o cliente 500. Assim, a sub-consulta não
retorna nenhuma linha. A consulta externa recebe os resultados da sub-consulta (null) e
utiliza estes resultados na cláusula WHERE. A consulta externa não encontra nenhum
cliente com a média de contratos maior do NULL (qualquer comparação com NULL
retorna o booleano NULL).
Nota:
O Operador ANY deve ser precedido por: =, !=, >, <, <=, >=
O Operador ALL deve ser precedido por: =, !=, >, <, <=, >=
Sub-consultas que retornam mais que uma linha são chamadas sub-consultas
multiple-row. Você utiliza operadores multiple-row, em vez de operadores single-row,
com uma sub-consulta multiple-row. O operador multiple-row aceita um ou mais valores.
Exemplo:
O operador ANY compara um valor para cada valor retornado por uma sub-consulta.
O exemplo acima exibe os contratos cujo total é menor que o total de qualquer contrato
do dia „04/01/2005‟. O maior total deste dia é R$4500. O comando SQL exibe todos os
contratos que tenham total menor que R$4500.
< ANY significa Menor do que Qualquer
> ANY significa Maior do que Qualquer
= ANY é equivalente a IN.
O operador ALL compara um valor com todos os valores retornados por uma sub-
consulta. O exemplo acima exibe os contratos cujo total é maior que o total de todos os
contratos do dia „04/01/05‟. O maior total é R$4500, assim a consulta retorna aqueles
contratos cujo total é maior que R$4500.
< ALL significa Menor do que Todos
> ALL significa Maior do que Todos
Nota: O operador NOT pode ser utilizado com os operadores IN, ANY e ALL.
Sub-consultas Multiple-Column
Exercícios – 8
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso. Escreva uma consulta para exibir o nome dos clientes e a data de
nascimento para todos os clientes que estão no mesmo estado do cliente
„Mário Cardoso‟, excluindo-o do resultado.
2. Crie uma consulta para exibir o id e o total do contrato, o nome do cliente
responsável pelo contrato para todos os contratos com total maior que a média
do total de contratos. Classifique o resultado em ordem descendente de total.
Execute a consulta.
3. Escreva uma consulta que mostre o id e o nome do cliente para todos os
clientes que são de um estado com qualquer cliente cujo nome contenha uma
letra „v‟ (minúscula). Execute a consulta.
4. Mostre o código Target e o preço dos cursos com pré-requisito o cod_trg
„THTML4‟.
5. Mostre o nome e o telefone de todos os clientes que compraram no dia
„06/01/2005‟. Execute a consulta.
9. Operadores SET
Objetivos
Verificar as formas de representar os operadores SET;
Realizar a união, intersecção e diferença entre SELECTs relacionados.
Operadores SET
União – UNION
A operação de união efetua uma soma de conjuntos eliminando as duplicidades.
Considerando-se a existência das duas tabelas A e B, as linhas resultantes da união seriam
representadas por LAUB. Isto significa que o resultado A é uma relação que contém
apenas as colunas indicadas. As linhas duplicadas que seriam criadas são eliminadas.
UNION ...
UNION ALL ...
Note que no SELECT anterior a primeira consulta retorna os clientes do estado igual a
„RS‟ e a segunda retorna os clientes de „RS‟ e „RJ‟. As linhas duplicadas não serão incluídas.
Note que no SELECT anterior a primeira consulta retorna os clientes do estado igual a
„RS‟ e a segunda retorna os clientes de „RS‟ e „RJ‟. As linhas duplicadas serão incluídas.
Neste último exemplo de união, foram somados três conjuntos. No primeiro conjunto,
somente as linhas com data de compra igual a „10/01/05‟. No segundo conjunto, apenas
as linhas com descontos válidos. Com estas restrições não houve necessidade de
utilizarmos UNION, uma vez que não haveria linhas duplicadas, tornando a operação mais
eficiente, não havendo necessidade de SORT.
Este resultado foi unido ao terceiro conjunto, que tinha como restrição TOTAL >
R$4000, podendo trazer linhas já presentes no conjunto resultante anterior. Desta forma
escolhemos utilizar o operador UNION.
Execute o comando do último exemplo e observe que as linhas estão duplicadas
(linhas sublinhadas). Isto ocorre porque a avaliação de duplicidade não se dá em relação a
Interseção - INTERSECT
A operação de interseção restringe o conjunto resultante às tuplas presentes em todos
os conjuntos participantes da operação. Considerando-se a existência de duas tabelas A e
B, as linhas resultantes da interseção seriam representadas por L A B. A interseção só pode
ser efetuada entre relações união compatíveis.
INTERSECT ...
Exemplo:
Diferença - MINUS
A operação de diferença efetua uma subtração de conjuntos eliminando as
duplicidades. Considerando a existência de duas tabela A e B, o resultado L é uma relação
que contém as linhas de A que não estão presentes em B. As linhas da diferença seriam
representadas por L A–B. A diferença só pode ser efetuada entre relações união-
compatíveis.
No Oracle SQL, os dois conjuntos participantes do processo de diferença são definidos
dinamicamente através de dois (ou mais) comandos SELECTs unidos pelo operador
MINUS.
MINUS ...
Exemplo 1:
Exemplo 2:
Exercícios – 9
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso. Crie uma expressão UNION que represente a união dos totais de cada
contrato e das somas dos itens de contrato. No primeiro SELECT selecione o
código do contrato, o valor total de todos os contratos e a string fixa definida
por „CONTRATOS‟. No segundo SELECT selecione o código do contrato, todas
as somas do total de cada item deste contrato e a string fixa „ITENS‟. Ordene
pela terceira coluna e depois pela primeira. Defina os alias nos dois SELECTs
como ID, TOTAL e STRING. Execute a consulta.
2. Crie um script para a operação de subtração (MINUS) entre dois SELECTs e a
intersecção(INTERSECT) com um terceiro SELECT. No primeiro SELECT selecione
ID, DT_COMPRA e TOTAL de todos os contratos. No segundo SELECT selecione
ID, DT_COMPRA e TOTAL de todos os contratos sem desconto (NULO ou
ZERO). Subtraia o primeiro pelo segundo. No terceiro SELECT selecione ID,
DT_COMPRA e TOTAL dos contratos realizados com clientes de SP. Execute a
consulta.
Objetivos
Descrever cada comando DML;
Inserir linhas em uma tabela;
Atualizar linhas de uma tabela;
Remover linhas de uma tabela;
Controlar transações.
Comando INSERT
Você pode adicionar linhas novas para uma tabela executando um comando INSERT.
Sintaxe:
tabela: é o nome da tabela.
coluna: é o nome da coluna da tabela que receberá os valores.
valor: é o valor correspondente para a coluna.
Nota: Este comando com a cláusula VALUES adiciona apenas uma linha de cada vez
para a tabela.
Uma vez que você pode inserir uma linha nova que contenha valores para cada coluna
da tabela, a lista de colunas não é obrigatória na cláusula INSERT. Porém, se você não
utilizar a lista de colunas, os valores devem ser listados de acordo com a ordem default
das colunas na tabela.
Por questões de clareza, utilize a lista de colunas na cláusula INSERT. Coloque valores
caractere e data entre aspas simples; não inclua valores numéricos entre aspas.
Método explícito:
ou
Método Descrição
Tenha certeza que a coluna de destino permita valores nulos verificando o status da
coluna Nulo? do comando DESCRIBE do SQL*Plus.
O Servidor Oracle automaticamente verifica todos os tipos de dados, intervalos de
valores e regras de integridade de dados. Qualquer coluna que não é listada
explicitamente recebe um valor nulo na linha nova.
SELECT *
FROM tcontratos
WHERE id = 1021;
Você pode produzir um comando INSERT que permite ao usuário adicionar valores
interativamente utilizando variáveis de substituição do SQL*Plus.
O exemplo acima armazena informações para uma classe de desconto na tabela
TDESCONTOS. Ele solicita ao usuário a classe de desconto, o valor da base inferior e o
valor da base superior.
Para valores caractere e data, o símbolo (&) e o nome da variável deve ficar entre
aspas simples.
Você pode salvar seu comando com variáveis de substituição para um arquivo e então
executá-lo. Cada vez que você executa o comando, ele solicitará novos valores. Customize
os prompts utilizando o comando ACCEPT do SQLPlus.
O exemplo acima armazena informações para uma classe de desconto na tabela
TDESCONTOS. Ele solicita ao usuário a classe de desconto, a base inferior de desconto e a
base superior de desconto utilizando mensagens customizadas.
Não prefixe parâmetros de substituição com o símbolo (&) quando referenciá-los no
comando ACCEPT. Utilize um hífen (-) para continuar um comando do SQLPlus na próxima
linha.
Exemplo:
Comando UPDATE
Você pode modificar linhas existentes utilizando o comando UPDATE.
UPDATE tabela
SET coluna = valor | expressão [, coluna =
valor | expressão]
[WHERE condição];
Sintaxe:
tabela: é o nome da tabela.
coluna: é o nome da coluna a alterar.
valor: é o valor, expressão correspondente ou Sub-consulta a ser atribuída para a
coluna.
condição: identifica as linhas a serem atualizadas; é composto de nomes de colunas,
expressões, constantes, Sub-consultas e operadores de comparação.
Confirme a operação de atualização examinando a tabela e exibindo as linhas
atualizadas.
Nota: Em geral, utilize a chave primária para identificar uma única linha. Utilizar outras
colunas pode causar a atualização indesejada de várias linhas. Por exemplo, identificar
uma única linha da tabela TCONTRATOS através da data de compra é perigoso porque
mais de um contrato pode ter a mesma data de compra.
UPDATE tcontratos
SET desconto = total * 0.5
WHERE id = 1000;
UPDATE tcontratos
SET desconto = total * 0.5;
UPDATE nome_tabela1
SET coluna1 = (SELECT coluna1
FROM nome_tabela1),
coluna2 = (SELECT coluna2
FROM nome_tabela2)
[, colunaN = (SELECT colunaN
FROM nome_tabelaN)..]
WHERE expressão;
Exemplo 1:
UPDATE media_contratos_clientes me
SET me.total = (SELECT AVG(co1.total)
FROM tcontratos co1
WHERE me.tclientes_id =
co1.tclientes_id),
me.desconto = (SELECT AVG(co2.desconto)
FROM tcontratos co2
WHERE me.tclientes_id =
co2.tclientes_id);
Exemplo 2
UPDATE media_contratos_clientes me
SET (me.total, me.desconto) =
(SELECT AVG(co1.total), AVG(co1.desconto)
FROM tcontratos co1
WHERE me.tclientes_id =
co1.tclientes_id);
Se você tentar atualizar um registro com um valor que invalide uma constraint de
integridade, você receberá um erro.
No exemplo acima, o contrato de id igual a 1 não existe na tabela pai (TCONTRATOS),
portanto você recebe o erro "parent key not found", ORA-02291.
Comando DELETE
Você pode remover linhas utilizando o comando DELETE.
Sintaxe:
tabela: é o nome da tabela.
condição : condição que seleciona as linhas a serem removidas; é composta de nomes
de colunas, expressões, constantes, Sub-consultas e operadores de comparação.
SELECT *
FROM tdescontos;
Exemplo:
Se você tentar remover um registro com um valor que invalide uma constraint de
integridade, você receberá um erro.
O exemplo acima tenta remover os contratos da tabela TCONTRATOS com ID = 1000
mas resulta em um erro porque o contrato com ID = 1000 possui itens na tabela TITENS, e
este contrato é utilizado como chave estrangeira definida sobre a coluna
titens.tcontratos_id. Se o registro pai que você tentou apagar possuir registros filhos,
então você recebe a mensagem de erro "child record found", ORA-02292.
Tipos de Transações
Tipo Descrição
Nota: Depois que uma transação termina, o próximo comando SQL executado iniciará
a próxima transação automaticamente.
Um comando DDL ou DCL é automaticamente confirmado (commit) e portanto
implicitamente termina a transação.
Controlando Transações
Você pode controlar a lógica das transações utilizando os comandos COMMIT,
SAVEPOINT e ROLLBACK.
Comando Descrição
Falhas do Sistema
Quando uma transação é interrompida por uma falha de sistema no servidor Oracle,
queda na conexão ou o usuário desconectou de forma anormal a transação inteira é
desfeita automaticamente. Isto previne o erro de causar mudanças não desejadas para os
dados e retorna as tabelas para o seu estado no momento do último commit. Desta
forma, o SQL protege a integridade das tabelas.
Efetivando os Dados
Faça as alterações:
UPDATE tcontratos
SET desconto = total * 0.5
WHERE id = 1000;
Efetive as alterações:
COMMIT;
Exemplo:
Ao tentar remover um registro da tabela TITENS, você pode acidentalmente apagar
toda a tabela. Você pode corrigir o engano, e então executar o comando novamente de
forma correta, tornando as mudanças permanentes.
Utilizando Savepoints
Desfazendo as Alterações Até uma Marca.
UPDATE tcursos
SET preco = 2000
WHERE id = 50;
SAVEPOINT ok;
UPDATE tcursos
SET carga_horaria = 30
WHERE id = 50;
ROLLBACK TO SAVEPOINT ok;
COMMIT;
Você pode criar uma marca dentro da transação corrente utilizando o comando
SAVEPOINT. A transação pode ser dividida então em seções menores. Você pode
descartar as mudanças pendentes até aquela marca utilizando o comando ROLLBACK TO
SAVEPOINT.
Se você criar um segundo savepoint com o mesmo nome de um savepoint anterior, o
savepoint mais anterior é removido.
Leitura Consistente
Usuários de banco de dados efetuam dois tipos de acesso ao banco de dados:
Operações de leitura (comando SELECT)
Operações de escrita (comandos INSERT, UPDATE e DELETE)
Você necessita de leitura consistente para que o seguinte aconteça:
A leitura e gravação do banco de dados são garantidas com uma visão
consistente dos dados.
Leituras não visualizam dados que ainda estão em processo de atualização.
Escritas para o banco de dados garantem que as mudanças são efetuadas de
uma forma consistente.
Mudanças feitas por um usuário não conflitam com mudanças que outro
usuário está fazendo.
O propósito da leitura consistente é assegurar que cada usuário visualize os
dados como eles ficaram antes do último commit, antes da operação DML
começar.
Lock
O que São Locks?
Locks são mecanismos que previnem interação destrutiva entre transações que
acessam o mesmo recurso, ou um objeto de usuário (como tabelas ou linhas) ou objetos
de sistema não visíveis aos usuários (como estruturas de dados compartilhados e linhas do
dicionário de dados).
Exemplo:
Exercícios – 10
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso. Descreva a estrutura da tabela TCLIENTES_VIP para identificar os nomes
das colunas.
2. Adicione a primeira linha de dados na tabela TCLIENTES_VIP a partir do
exemplo de dados a seguir.
COMMIT;
14. Adicione uma linha para a tabela TCLIENTES_VIP com os valores id = 6, nome =
„Roberto‟, sobrenome = „Pires‟ , clienteid = rpires e credito = 2000.
15. Visualize sua inserção para a tabela.
COMMIT;
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.
Objeto Descrição
Tabela (Table) Unidade básica de armazenamento. Composta por linhas e colunas.
Visões (View) Representação lógica de um subconjunto de dados de uma ou mais
tabelas.
Sequencia Estrutura que gera números sequenciais para chaves primárias.
(Sequence)
Índice (Índex) Estrutura que aumenta a performance de consultas.
Sinônimo Estrutura que especifica um outro nome para um objeto.
(Synonym)
Nota: Outros objetos de banco de dados estão disponíveis, mas não serão estudados
neste curso.
Convenções de Nomes
Nomeie tabelas e colunas de acordo com o padrão de nomenclatura para qualquer
objeto do banco de dados Oracle:
Nomes de tabela e colunas devem começar com uma letra e podem ter de 1
até 30 caracteres de tamanho.
Nomes devem conter somente os caracteres A–Z, a–z, 0–9, _ (underscore), $ e #.
Nomes não devem possuir o mesmo nome de outro objeto criado no schema
do mesmo usuário do Servidor Oracle.
Nomes não devem ser uma palavra reservada do Oracle.
Diretrizes de Nomenclatura
Utilize nomes descritivos para tabelas e outros objetos do banco de dados.
Nota: Nomes não fazem distinção entre maiúsculas e minúsculas. Por exemplo,
TCLIENTES é tratado da mesma forma que tCLIENTES ou tclienteS.
Crie tabelas para armazenar dados executando o comando SQL CREATE TABLE. Este
comando é um dos comandos da linguagem de definição de dados (DDL), que serão
discutidos nos próximos capítulos. Comandos DDL são um subconjunto dos comandos
SQL utilizados para criar, modificar ou remover estruturas de banco de dados Oracle. Estes
comandos possuem um efeito imediato no banco de dados, e eles também registram
informações no dicionário de dados.
Para criar uma tabela, o usuário deve possuir o privilégio CREATE TABLE e uma área de
armazenamento na qual criará os objetos. O administrador do banco de dados utiliza
comandos da linguagem de controle de dados (DCL), que serão discutidos em um capítulo
posterior, para conceder privilégios aos usuários.
Sintaxe:
schema: é igual ao nome do usuário dono do objeto.
tabela: é o nome da tabela.
DEFAULT expr: especifica um valor default se um valor for omitido para a coluna no
comando INSERT.
coluna: é o nome da coluna.
Tipo_de_dado: é o tipo de dado e tamanho da coluna.
Opção DEFAULT
Exemplo:
Uma coluna pode receber um valor default através da opção DEFAULT. Esta
opção impede que valores nulos entrem nas colunas se uma linha é inserida
sem um valor para esta coluna. O valor default pode ser uma literal, uma
expressão ou uma função SQL, como SYSDATE e USER.
O valor não pode ser o nome de outra coluna ou uma pseudocoluna, como
NEXTVAL no caso de sequences que veremos adiante. A expressão default deve
corresponder ao tipo de dado da coluna.
Criando Tabelas
Crie a tabela:
DESC tdescontos
O exemplo acima cria a tabela TDESCONTOS, com três colunas chamadas CLASSE,
BASE_INFERIOR e BASE_SUPERIOR. Confirme a criação da tabela executando o comando
DESCRIBE.
Uma vez que o comando de criação de tabelas é do tipo DDL, um commit automático
ocorre quando este comando é executado.
SELECT table_name
FROM user_tables;
Você pode consultar as views do dicionário de dados para visualizar vários objetos
do banco de dados criados por você e por outros usuário (dependendo do nível de
acesso). Algumas visões bastante utilizadas são:
USER_TABLES, ALL_TABLES ou DBA_TABLES;
USER_OBJECTS, ALL_OBJECTS ou DBA_OBJECTS;
USER_CATALOG, ALL_CATALOG ou DBA_CATALOG.
Nota: Além destas visões que possuem dados detalhados, ainda existem resumos
como TAB, OBJ ou CAT.
Tipos de Dados
Tipo de Dado Descrição
Valor numérico de tamanho variável contendo um número de
NUMBER(precisão, máximo de dígitos (total de dígitos) definido por (precisão),
decimais) sendo o número de dígitos à direita do ponto decimal
e (decimais) definido por (decimais).
NUMERIC(precisão, A precisão máxima suportada é 38. Se nem a precisão nem
decimais) os decimais são especificados, então um número com
precisão e decimais de até 38 dígitos pode ser utilizado
(significa que você pode utilizar um número de até 38 dígitos
e podem estar à direita ou a esquerda do ponto decimal).
Diretrizes
A tabela será criada com os nomes de coluna especificados, e as linhas
recuperadas pelo comando SELECT serão inseridas na tabela.
A definição da coluna pode conter somente o nome e o valor default.
Se as especificações de coluna forem determinadas, o número de colunas deve
ser igual ao número de colunas da lista da cláusula SELECT da Sub-consulta.
Se nenhuma especificação de coluna é determinada, os nomes das colunas da
tabela serão iguais aos nomes de coluna da Sub-consulta.
Depois de criar as suas tabelas, você pode necessitar mudar a estrutura da tabela
porque você omitiu uma coluna ou sua definição de coluna precisa ser modificada, ou
ainda excluir uma coluna que você julga sem importância. Você pode fazer isto utilizando
o comando ALTER TABLE.
Você pode adicionar colunas para uma tabela utilizando o comando ALTER TABLE com
a cláusula ADD.
Sintaxe:
tabela: é o nome da tabela.
coluna: é o nome da nova coluna.
Tipo_de_dado: é o tipo de dado e tamanho da nova coluna.
DEFAULT expressão: especifica o valor default para uma nova coluna.
Você pode modificar colunas existentes em uma tabela utilizando o comando ALTER
TABLE com a cláusula MODIFY.
Você pode excluir colunas existentes em uma tabela utilizando o comando ALTER
TABLE com a cláusula DROP.
Nota: Se uma tabela já possui linhas quando uma coluna é adicionada, então a nova
coluna é inicialmente nula em todas as linhas. A não ser que seja definido um valor
DEFAULT para a coluna.
Você pode modificar uma definição de coluna utilizando o comando ALTER TABLE
com a cláusula MODIFY. A modificação de coluna pode incluir mudanças para o tipo de
dado, o tamanho e valor default.
Diretrizes
Aumente o tamanho ou precisão de uma coluna numérica.
Diminua o tamanho de uma coluna se ela possuir somente valores nulos ou se a
tabela não possuir nenhuma linha.
Modifique o tipo de dado se a coluna possuir somente valores nulos.
Converta uma coluna do tipo de dado CHAR para VARCHAR2 ou converta uma
coluna VARCHAR2 para o tipo de dado CHAR se a coluna possuir somente
valores nulos ou se você não modificar o tamanho.
Uma mudança para o valor default de uma coluna afeta somente as inserções
subsequentes para a tabela.
Diretrizes
A coluna e todos os dados da coluna são removidos.
Diretrizes
O nome da coluna é renomeado.
Todos os dados da coluna são mantidos.
Definições de índices, constraints e privilégios são mantidas.
Onde:
tabela: é o nome da tabela.
Diretrizes
A tabela somente poderá ser utilizada para operações de consulta.
Não serão permitidas operações de INSERT, UPDATE e DELETE na tabela.
Exemplo:
Onde:
tabela: é o nome da tabela.
Diretrizes
Serão permitidas operações de escrita (INSERT, UPDATE e DELETE) na tabela.
Serão permitas operações de consulta (SELECT) na tabela.
Exemplo:
Exemplo:
Diretrizes
O nome da tabela é renomeado.
Todos os dados da tabela são mantidos.
Definições de índices, constraints e privilégios são mantidas.
Renomeando um Objeto
Sintaxe:
Exemplo:
Diretrizes
O nome do objeto é renomeado.
Onde:
tabela: é o nome da tabela.
Exemplo:
Outro comando DDL é o comando TRUNCATE TABLE, utilizado para remover todas as
linhas de uma tabela e liberar o espaço de armazenamento utilizado por ela. Quando
utilizar o comando TRUNCATE TABLE, você não pode efetuar rollback das linhas
removidas.
Você deve ser o dono da tabela ou possuir o privilégio de sistema DELETE TABLE para
truncar uma tabela.
O comando DELETE também pode remover todas as linhas de uma tabela, porém ele
não libera o espaço de armazenamento ocupado por ela.
Onde:
tabela: é o nome da tabela.
coluna: é o nome da coluna de uma tabela.
texto: é o texto do comentário.
Você pode adicionar um comentário de até 2000 bytes sobre uma coluna, tabela, visão
ou snapshot utilizando o comando COMMENT. O comentário é armazenado no dicionário
de dados e pode ser visualizado em uma das seguintes visões do dicionário de dados na
coluna COMMENTS:
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS
Você pode remover um comentário do banco de dados atribuindo uma string vazia ('').
Exercícios – 11
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso. Crie a tabela PESSOAS baseado na descrição abaixo.
2. Insira linhas na tabela PESSOAS com dados a partir das linhas da tabela
TCLIENTES. Inclua somente as colunas necessárias (id, nome).
3. Crie a tabela CONTRATOS baseado na descrição abaixo.
12. Implementando
Constraints
Objetivos
Descrever constraints de integridade;
Criar e administrar constraints.
Constraint Descrição
NOT NULL Especifica que a coluna não pode conter valores nulos
CHECK
Especifica uma condição que deve ser verdadeira
Tabela 10-1: Constraints de integridade de dados
Onde:
schema: é o nome do usuário dono.
tTabela: é o nome da tabela.
DEFAULT expressão: especifica um valor default se um valor for omitido no comando
INSERT.
coluna: é o nome da coluna.
Tipo_de_dado: é o tipo de dado e tamanho da coluna.
Exemplo:
O exemplo acima aplica a constraint NOT NULL para as colunas ID e NOME da tabela
TCLIENTES. Uma vez que estas constraints não possuem nomes definidos, o Servidor
Oracle criará nomes para elas.
Você pode especificar o nome de uma constraint na sua própria especificação:
Exemplo:
Nota: Todos os exemplos de constraints descritos neste capítulo podem não estar
presentes nas tabelas de exemplo fornecidas com este curso. Se desejar, estas constraints
podem ser adicionadas as tabelas.
Exemplo:
Exemplo:
Nota: Um índice único é criado automaticamente para uma coluna de chave primária.
Sem a opção ON DELETE CASCADE ou ON DELETE SET NULL uma linha da tabela pai
não pode ser removida se estiver sendo referenciada na tabela filha.
Constraint CHECK
A constraint CHECK define uma condição que cada linha deve satisfazer. A condição
pode utilizar a mesma construção que as condições de consultas, com as seguintes
exceções:
Referências para as pseudo colunas CURRVAL, NEXTVAL, LEVEL e ROWNUM.
Chamadas para as funções SYSDATE, UID e USER.
Consultas que referenciam outros valores em outras linhas.
Uma única coluna pode ter múltiplas constraints tipo CHECK que referenciam a
definição da coluna. Não há nenhum limite quanto ao número de constraints tipo CHECK
que você pode definir em uma coluna.
Constraints CHECK podem ser definidas ao nível de coluna ou a nível de tabela.
Definindo Check Contraints a nível de coluna.
Exemplo:
Você pode adicionar uma constraint para tabelas existentes utilizando o comando
ALTER TABLE com a cláusula ADD.
Sintaxe:
tabela: é o nome da tabela.
constraint: é o nome da constraint.
Tipo_constraint: é o tipo de constraint.
col1, col2: é o nome das colunas afetada sobre as quais a constraint foi definida.
Diretrizes
Você pode adicionar, remover, habilitar ou desabilitar uma constraint, mas você
não pode modificar sua estrutura.
Você pode adicionar uma constraint NOT NULL para uma coluna existente
utilizando a cláusula MODIFY do comando ALTER TABLE.
Nota: Você pode definir uma coluna NOT NULL somente se a tabela não possuir
nenhuma linha porque não podem ser especificados dados para linhas existentes ao
mesmo tempo em que a coluna é adicionada.
O exemplo acima cria uma constraint FOREIGN KEY na tabela TCURSOS. A constraint
garante que um curso possua um pré-requisito válido na tabela TCURSOS.
Onde:
tabela: é o nome da tabela.
coluna: é o nome da coluna afetada pela constraint.
constraint: é o nome da constraint.
Exemplo:
Remova a constraint de pré-requisitos da tabela TCURSOS:
ALTER TABLE tcursos DROP CONSTRAINT tcursos_id_pre_requisito_fk;
Para remover uma constraint, você pode identificar o seu nome a partir das visões do
dicionário de dados USER_CONSTRAINTS e USER_CONS_COLUMNS. Então utilize o
comando ALTER TABLE com a cláusula DROP. A opção CASCADE da cláusula DROP
também remove qualquer constraint dependente.
Quando você remove uma constraint de integridade, esta constraint não mais é
verificada pelo Servidor Oracle e não fica mais disponível no dicionário de dados.
Desabilitando Constraints
Sintaxe:
Onde:
tabela: é o nome da tabela.
constraint : é o nome da constraint.
Diretrizes
Você pode utilizar a cláusula DISABLE no comando CREATE TABLE e no
comando ALTER TABLE.
A cláusula CASCADE desabilita as constraints de integridade dependentes em
cascata.
Habilitando Constraints
Sintaxe:
Onde:
tabela: é o nome da tabela.
constraint: é o nome da constraint.
Você pode habilitar uma constraint sem removê-la ou recriá-la utilizando o comando
ALTER TABLE com a cláusula ENABLE.
Diretrizes
Se você habilita uma constraint, esta constraint aplica-se a todos os dados da
tabela. Todos os dados da tabela devem ajustar-se a constraint.
Se você habilita uma constraint UNIQUE key ou PRIMARY KEY, um índice do
tipo UNIQUE ou PRIMARY KEY é criado automaticamente.
Você pode utilizar a cláusula ENABLE no comando CREATE TABLE e no
comando ALTER TABLE.
Visualizando Constraints
Após criar uma tabela, você pode confirmar sua existência executando um comando
DESCRIBE. A única constraint que você pode verificar desta forma é a constraint NOT
NULL. Para visualizar todas as constraints de sua tabela, consulte a tabela
USER_CONSTRAINTS.
Nota: Constraints que não receberam nomes na sua criação recebem um nome
atribuído pelo sistema. Na coluna CONSTRAINT_TYPE:
“C” representa CHECK
“P” representa PRIMARY KEY
“R” representa integridade referencial (FOREIGN KEY)
“U” representa UNIQUE key.
Exercícios – 12
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso. Adicione uma constraint PRIMARY KEY para a tabela CONTRATOS
utilizando a coluna ID.
2. Crie uma constraint PRIMARY KEY na tabela PESSOAS utilizando a coluna ID.
3. Adicione uma referência de chave estrangeira para a tabela CONTRATOS que
garanta que o contrato não seja associado a uma pessoa com ID inexistente
(coluna PESSOAS_ID).
4. Confirme que as constraints foram adicionadas consultando a visão
USER_CONSTRAINTS. Observe os tipos e nomes das constraints.
5. Modifique a tabela CONTRATOS. Adicione uma coluna IMPOSTO com o tipo de
dado NUMBER(7,2) definindo que o valor do imposto não pode ser negativo.
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.
Vantagens de Visões
Restringem o acesso para o banco de dados porque a visão pode exibir uma
porção seletiva do banco de dados.
Permitem aos usuários fazer consultas simples para recuperar os resultados de
consultas complexas. Por exemplo, visões permitem aos usuários consultar
informações de múltiplas tabelas sem saber escrever um comando de join.
Provê independência dos dados para os usuários e programas de aplicação.
Uma visão pode ser utilizada para recuperar dados de várias tabelas.
Provê acesso aos dados para grupos de usuários de acordo com seus critérios
particulares.
Existem duas classificações para as visões: simples e complexas. A diferença básica está
relacionada as operações DML (INSERT, UPDATE e DELETE).
Uma visão simples:
Deriva dados de uma única tabela
Não utiliza funções de grupo ou grupos de dados
Não utiliza DISTINCT
Pode executar operações DML através da visão
Onde:
CREATE OR REPLACE: recria a visão caso ela já exista.
FORCE: cria a visão mesmo que as tabelas básicas não existam.
NOFORCE: cria a visão somente se as tabelas básicas existem. Este é o default.
nome_view: é o nome da visão.
alias: especifica nomes para as expressões selecionadas pela consulta da visão. O
número de alias deve corresponder ao número de expressões selecionadas pela visão.
sub-consulta: é um comando SELECT completo. Você pode utilizar alias para as colunas
na lista da cláusula SELECT.
WITH CHECK OPTION: especifica que somente as linhas acessíveis para a visão podem
ser inseridas ou atualizadas.
constraint é o nome atribuído a constraint da cláusula CHECK OPTION.
WITH READ ONLY: assegura que nenhuma operação DML possa ser executada nesta
visão.
Exemplo:
O exemplo acima cria uma visão que contém os contratos com total maior que
R$5000.
Você pode exibir a estrutura de uma visão utilizando o comando DESCRIBE.
DESCRIBE vcontratos_top
Você pode controlar os nomes de colunas incluindo alias de coluna dentro da Sub-
consulta.
O exemplo acima cria uma visão contendo o número do curso com o alias ID , o
código Target com o alias TRG e o preço do curso como VALOR para todos os curso sem
pré-requisitos.
Alternativamente, você pode controlar os nomes das colunas incluindo alias de coluna
na cláusula CREATE VIEW.
Exemplo:
View criada.
SELECT *
FROM vcursos_basicos;
Você pode recuperar dados de uma visão da mesma forma que qualquer tabela. Você
pode exibir o conteúdo de toda a visão ou apenas linhas e colunas específicas.
A opção OR REPLACE permite recriar uma visão mesmo se outra já existir com este
nome, substituindo a versão anterior. Isto significa que a visão pode ser alterada sem ser
removida, recriando-a e mantendo os privilégios de objeto.
Nota: Quando atribuir alias de colunas na cláusula CREATE VIEW, lembre-se que os
alias são listados na mesma ordem das colunas na Sub-consulta.
O exemplo acima cria uma visão complexa com os valores do menor, maior contrato e
a média de todos. Observe os nomes alternativos que foram especificados para a visão.
Esta é uma exigência se qualquer coluna da visão é derivada de uma função ou uma
expressão.
Você pode ver a estrutura da visão utilizando o comando DESCRIBE do SQL*Plus.
Mostre o conteúdo da visão executando um comando SELECT.
SELECT *
FROM vcontratos;
Onde:
Nome_view: é o nome da visão.
Exemplo:
Você utiliza o comando DROP VIEW para remover uma visão. O comando remove a
definição da visão do banco de dados. Remover visões não possui nenhum efeito nas
tabelas nas quais a visão estava baseada. Visões ou outras aplicações baseadas em visões
apagadas tornam-se invalidas. Somente o dono ou um usuário com o privilégio DROP
ANY VIEW pode remover uma visão.
Exemplo:
UPDATE clientes_rs
SET estado = 'SP'
WHERE id = 100;
O exemplo acima modifica a visão clientes_rs para prevenir qualquer operação DML
através da visão.
Qualquer tentativa de executar um comando DML na visão clientes_rs resultará em um
erro.
Exercícios – 13
1. No SQL Developer utilize a sua conexão e conecte-se ao banco de dados do
curso. Crie uma visão chamada VCONTRATOS baseada no número do contrato,
data de compra e no número do cliente a partir da tabela TCONTRATOS.
Modifique o cabeçalho para o código do cliente para “CLIENTE”.
2. Mostre o conteúdo da visão VCONTRATOS.
3. Selecione a coluna VIEW_NAME e TEXT a partir da visão USER_VIEWS do
dicionário de dados.
4. Utilizando a visão VCONTRATOS, execute uma consulta para exibir todos os
clientes e datas de compras.
5. Crie uma visão chamada VCLIENTESRS que contenha o número do cliente, o
nome, a cidade e o estado para todos os clientes com estado igual a „RS‟. Não
permita que operações DML sejam executadas através da visão.
6. Mostre a estrutura e o conteúdo da visão VCLIENTESRS.
Objetivos
Criar, alterar e utilizar sequences;
Criar e alterar índices;
Criar sinônimos.
Sequência criada.
O exemplo acima cria uma sequence chamada TCLIENTES_SEQ para ser utilizada para
a coluna ID da tabela TCLIENTES. A sequência começa em 201, não permite cache e não
permite que ela seja cíclica.
Não utilize a opção CYCLE se a sequence for utilizada para gerar valores de chave
primária a menos que você possua um mecanismo que remova linhas antigas mais
rapidamente que os ciclos da sequence.
SELECT tclientes_seq.CURRVAL
FROM dual;
Se você atingir o limite MAXVALUE para uma sequence, não serão alocados valores
adicionais da sequence e você receberá um erro que indica que o valor de MAXVALUE foi
excedido. Para continuar utilizando a sequence, você pode modificá-la utilizando o
comando ALTER SEQUENCE.
Sintaxe:
Onde:
sequence: é o nome do gerador da sequence.
Exemplo:
Exemplo:
Onde:
sequence: é o nome do gerador da sequência.
Exemplo:
O que é um Índice?
Um índice do Servidor Oracle é um objeto de um schema que pode acelerar a
recuperação das linhas utilizando um ponteiro. Podem ser criados explicitamente ou
automaticamente. Se você não possuir um índice em uma coluna, então um método de
acesso chamado full table scan ocorrerá.
Um índice fornece acesso direto e rápido para as linhas de uma tabela. Seu propósito
é reduzir a necessidade de I/O de disco utilizando um caminho indexado para localizar os
dados rapidamente. O índice é automaticamente utilizado e mantido pelo Servidor Oracle.
Uma vez criado, nenhuma atividade direta é requerida por parte do usuário.
Índices são lógica e fisicamente independentes da tabela que indexam. Isto significa
que eles podem ser criados ou removidos a qualquer momento e não causam nenhum
efeito nas tabelas ou outros índices.
Nota: Quando você remove uma tabela, os índices correspondentes também são
removidos.
Criando um Índice
Crie um índice em uma ou mais colunas executando o comando CREATE INDEX.
Sintaxe:
Onde:
nomeindice: é o nome do índice.
tabela: é o nome da tabela.
coluna: é o nome da coluna da tabela a ser indexada.
Exemplo:
Lembre-se que se você quiser garantir unicidade, você deve definir uma constraint do
tipo UNIQUE na definição da tabela. Então, um índice único será criado automaticamente.
Consultando os Índices
SELECT ic.index_name, ic.column_name, ic.column_position col_pos,
ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'TCLIENTES';
Removendo um Índice
Remova um índice do dicionário de dados:
Você não pode modificar índices. Para alterar um índice, você deve removê-lo e então
criá-lo novamente. Remova a definição de um índice do dicionário de dados executando o
comando DROP INDEX. Para remover um índice, você deve ser o dono do índice ou
possuir o privilégio DROP ANY INDEX.
Sintaxe:
nomeindice: é o nome do índice.
Sinônimos
Sintaxe:
Para referenciar uma tabela criada por outro usuário, você deve prefixar o nome da
tabela com o nome do usuário que a criou seguido por um ponto.
Criando um sinônimo você elimina a necessidade de qualificar o nome do objeto com
o schema e o provê um nome alternativo para uma tabela, visão, sequence, procedure ou
outros objetos.
Este método pode ser especialmente útil com nomes de objeto longos, como visões.
Onde:
PUBLIC: cria um sinônimo acessível a todos os usuários.
sinônimo: é o nome do sinônimo a ser criado.
objeto: identifica o objeto para o qual o sinônimo deve ser criado.
Diretrizes
O objeto não pode estar contido em uma package.
Um nome de sinônimo privado deve ser distinto de todos os outros objetos
criados pelo mesmo usuário.
O exemplo acima cria um sinônimo privado para a visão VCONTRATOS_TOP para uma
referência mais rápida.
O DBA pode criar um sinônimo público acessível para todos os usuários. O exemplo
abaixo cria um sinônimo público chamado CLIENTES para a tabela TCLIENTES do usuário
DESENV:
Exemplos:
No ambiente de desenvolvimento:
No ambiente de produção:
Removendo um Sinônimo
Para remover um sinônimo, utilize o comando DROP SYNONYM. Somente um DBA
pode remover um sinônimo público.
Sintaxe:
Onde:
sinônimo: é o nome do sinônimo a ser criado.
Exemplos:
Exercícios – 14
1. No utilize a sua conexão e conecte-se ao banco de dados do curso. Crie uma
sequência para ser utilizada com a coluna da chave primária da tabela PESSOAS.
A sequência deve iniciar em 10 e possuir um valor máximo de 200. Forneça para
a sequência um incremento de 1 e o nome como SPESSOAS_ID.
2. Crie um arquivo de script para exibir a seguinte informação sobre suas
sequências: o nome da sequência, o valor máximo, o incremento e o último
número fornecido. Execute o comando.
3. Escreva um script interativo para inserir uma linha na tabela PESSOAS. Coloque
o nome do arquivo como e14q3.sql. Utilize a sequência que você criou para a
coluna ID. Crie um prompt customizado para solicitar o nome da pessoa.
Execute o script adicionando duas pessoas chamadas “Maria de Lourdes” e
“Samuel Medeiros”. Efetive as inserções.
4. Crie um índice para a coluna definida como FOREIGN KEY na tabela
CONTRATOS.
5. Mostre os índices que existem no dicionário de dados para a tabela
CONTRATOS.
Apêndice 1 – Comandos do
SQL*Plus
Objetivos
Conhecer alguns comandos do com SQL*Plus.
Comando Descrição
C[HANGE] / old / new Modifica o texto (old) para o novo (new) na linha corrente
Comando Descrição
BTI[TLE] [text | OFF | ON] Especifica um rodapé a ser apresentado no final de cada página
do relatório
BRE[AK] [ON report_element] Suprime valores duplicados e divide linhas de dados com linhas
em branco
Diretrizes
Todos os comandos de formatação permanecem em efeito até o final da sessão
do SQL*Plus ou até que o formato fixado seja sobrescrito ou limpo.
Lembre-se de voltar suas configurações do SQL*Plus para os valores default
depois de todo relatório.
Não existe nenhum comando para configurar uma variável do SQL*Plus para
seu valor default; você deve conhecer o valor específico ou encerrar sua sessão
e conectar novamente.
Se você fornecer um alias para sua coluna, você deve referenciar o nome do
alias, não o nome da coluna.
Comando COLUMN
COL[UMN] [{column|alias} [option]]
Opção Descrição
HEA[DING] text Configura o cabeçalho da coluna. O caractere pipe (|) pode forçar
uma quebra de linha no cabeçalho se você não utilizar justificação
COLUMN nome
Comando Descrição
Se você tiver um comando muito longo, você pode continuá-lo na próxima linha
terminando a linha atual com um hífen (-).
Utilize o comando BREAK para dividir as linhas e suprimir valores duplicados. Para
assegurar que o comando BREAK funcione corretamente, ordene pelas colunas nas quais
você está quebrando.
Sintaxe:
BREAK on column[|alias|row|report]
CLEAR BREAK
TTI[TLE] [text|OFF|ON]
Diretrizes
Você pode incluir linhas em branco entre os comandos do SQL*Plus em um
script.
Você pode abreviar comandos do SQL*Plus.
Inclua comandos de limpeza de formatação ao término do arquivo para
restaurar o ambiente original do SQL*Plus.
Relatório de Exemplo
Código
Target Curso Horas Preço
-------- ------------------------------------------------------- ----- --------------------
TAOAS Administração do Oracle 10G Application Server 18 R$956,00
TAT8I Otimização de Aplicativos Oracle R$956,00
TDR6ID Oracle 10G Designer: Design e Geração do Banco de Dados R$956,00
TDR6IM Oracle 10G Designer: Modelagem de Sistemas R$956,00
TDR6IW Oracle 10G Designer: Design e Geração de Aplicações par R$956,00
TD31A Oracle 10G Discover para Administradores R$956,00
TD6IREP Oracle 10G Designer: Design e Geração de Reports R$956,00
TF6I-A Oracle 10G Developer: Forms - Parte II Avançado R$956,00
TOPC Oracle 10G Portal - Construindo Portais Corporativos R$956,00
TOPP Oracle 10G Portal - Construindo Portlets R$956,00
TASPAV ASP Avançado 20 R$1.000,00
TASP00 ASP - Criando uma Loja Virtual em Banco de Dados R$1.000,00
TCOLMX ColdFusion R$1.000,00
TJFUND Java Fundamentals R$1.000,00
TOOUML Orientação a Objetos - Fundamentos UML, Análise e Proje R$1.000,00
TPHPAV PHP Avançado R$1.000,00
TPHPOO PHP R$1.000,00
TPOSAD PostgreSQL: Administração do Banco de dados R$1.000,00
TPOSUP PostgreSQL: Linguagem Procedural e Unidades de Programa R$1.000,00
TSQLAV SQL Standard Avançado R$1.000,00
TSQLST SQL Standard R$1.000,00
TXML00 XML R$1.000,00
TDAWPL Desenvolvimento de Aplicações Web em PL/SQL 18 R$1.051,60
TWAWAS WebSphere Administração do WebSphere Application Server 30 R$1.200,00
TWSADV WebSphere Studio Application Developer V4.0 - Desenvolv R$1.200,00
WSphPort WebSphere Portal Server V4.0 - Desenvolvimento de Porta R$1.200,00
TF6I Oracle 10G Developer: Forms - Parte I R$1.275,00
TR6I Oracle 10G Developer: Reports R$1.275,00
TJADVN Java Advanced e Acesso a Banco de Dados R$1.500,00
TDR6IG Oracle 10G Designer: Design e Geração da Aplicação R$1.594,00
TO10G1 Introdução ao Oracle 10G I: Conceitos básicos do Oracle R$1.800,00
Confidencial
SELECT *
FROM tclientes;
4. Faça uma query que selecione as colunas nome, preço e desconto da tabela
TCURSOS. Coloque o título da coluna DESCONTO como "Desconto
Promocional".
A tabela TCURSOS não possui uma coluna chamada PREÇO, o nome correto da
coluna correta é PRECO.
Operador de multiplicação é “*” e não “x”.
O alias DESCONTO CURSO possui mais de uma palavra, portanto o alias correto
seria DESCONTO_CURSO ou "DESCONTO CURSO".
8. Crie uma consulta para exibir o id, data de compra, desconto e o total para cada
contrato, mostrando o id do contrato por primeiro.
3. Crie uma consulta para exibir o nome, endereço, cidade, cep, telefone, do
cliente com o id 140.
4. Crie uma consulta para exibir o id, dt_compra, desconto e total dos contratos
(tabela tcontratos) para todos os contratos cuja total não está na faixa de 2000
à 5000.
SELECT *
FROM tcontratos
WHERE desconto is null;
4. Altere a consulta anterior para adicionar uma nova coluna que subtraia o preço
antigo do novo preço. Coloque o alias da coluna como “Aumento”. Execute a
consulta.
5. Mostre o nome de cada cliente e calcule o número de meses entre a data atual
e a data de nascimento. Coloque o alias da coluna como “Meses de Vida”.
Ordene o resultado pelo número de meses. Arredonde o número de meses para
o número inteiro mais próximo. Execute a consulta.
SELECT nome,
ROUND(MONTHS_BETWEEN(SYSDATE,dt_nascimento))
"Meses de Vida"
FROM tclientes
ORDER BY 2;
6. Crie uma consulta para exibir o código Target e o preço de todos os cursos.
Formate o preço para exibir como R$1.000,00. Coloque o alias da coluna como
“Valor Curso”. Execute a consulta.
3. Crie uma lista única de todos os contratos que possuem clientes com a letra „A‟
(maiúscula ou minúscula) no nome, ordene por ordem alfabética. Execute a
consulta.
4. Escreva uma consulta para exibir o nome do cliente, id do contrato e total, para
todos os contratos que não possuem desconto (NULO ou ZERO). Execute a
consulta.
1. Funções de grupo atuam sobre muitas linhas para produzir uma única linha
para cada grupo formado? Sim.
2. Funções de grupo incluem nulos nos cálculos? Não.
3. No utilize a sua conexão e conecte-se ao banco de dados do curso. Mostre o
maior, o menor, a soma e a média do total de todos os contratos. Coloque o
alias das colunas como "Máximo", "Mínimo", "Soma" e "Média". Arredonde os
resultados com zero dígitos decimais. Execute a consulta.
5. Escreva uma consulta que mostre a diferença entre o maior e menor contrato.
Coloque o alias da coluna como “DIFERENÇA”. Execute a consulta.
UNDEFINE data1
UNDEFINE data2
CLEAR COLUMN
SET VERIFY ON
DESC tclientes_vip
INSERT INTO
tclientes_vip(id,sobrenome,nome,clienteid,credito)
VALUES (2,'Moura','Ana','amoura',860);
SELECT *
FROM tclientes_vip;
INSERT INTO
tclientes_vip(id,sobrenome,nome,clienteid,credito)
VALUES (3,'Pinheiro','Viviane','vpinheir',1100);
INSERT INTO
tclientes_vip(id,sobrenome,nome,clienteid,credito)
VALUES (4,'Dutra','Manuel','mdutra',750);
INSERT INTO
tclientes_vip(id,sobrenome,nome,clienteid,credito)
VALUES (5,'Silva','Cesar','csilva',1550);
SELECT *
FROM tclientes_vip;
COMMIT;
UPDATE tclientes_vip
SET sobrenome = 'Souza'
WHERE id = 3;
9. Modifique o crédito para 1000 para todos os clientes com o crédito menor que
900.
Resposta:
UPDATE tclientes_vip
SET credito = 1000
WHERE credito < 900;
SELECT *
FROM tclientes_vip;
SELECT *
FROM tclientes_vip;
COMMIT;
14. Adicione uma linha para a tabela TCLIENTES_VIP com os valores id = 6, nome =
„Roberto‟, sobrenome = „Pires‟ , clienteid = rpires e credito = 2000.
Resposta:
INSERT INTO
tclientes_vip(id,sobrenome,nome,clienteid,credito)
VALUES (6,'Pires','Roberto','rpires',2000);
SELECT *
FROM tclientes_vip;
SAVEPOINT A;
SELECT *
FROM tclientes_vip;
ROLLBACK TO SAVEPOINT A;
SELECT *
FROM tclientes_vip;
COMMIT;
Resposta:
2. Insira linhas na tabela PESSOAS com dados a partir das linhas da tabela
TCLIENTES. Inclua somente as colunas necessárias (id, nome).
Resposta:
Resposta:
SELECT table_name
FROM user_tables
WHERE table_name IN ('PESSOAS','CONTRATOS');
2. Crie uma constraint PRIMARY KEY na tabela PESSOAS utilizando a coluna ID.
Resposta:
SELECT *
FROM vcontratos;
DESCRIBE vclientesrs
SELECT *
FROM vclientesrs;
3. Escreva um script interativo para inserir uma linha na tabela PESSOAS. Coloque
o nome do arquivo como e14q3.sql. Utilize a sequência que você criou para a
coluna ID. Crie um prompt customizado para solicitar o nome da pessoa.
Execute o script adicionando duas pessoas chamadas “Maria de Lourdes” e
“Samuel Medeiros”. Efetive as inserções.
Resposta:
UNDEFINE pnome
COMMIT;