Академический Документы
Профессиональный Документы
Культура Документы
Verso: 01 Pg. 1/134 Vigncia: SQL Bsico para Oracle Data: 05/07/2011
Compilao
Contedo
Contedo.................................................................................................................. 2 Banco de dados relacional........................................................................................9 Modelagem de Dados...............................................................................................9 Entidade................................................................................................................9 Relacionamento....................................................................................................9 Tipos de relacionamento.....................................................................................11 Relacionamento um-para-um...........................................................................11 Relacionamento um-para-muitos.....................................................................11 Relacionamento muitos-para-muitos...............................................................11
............................................................................................................................12 Cardinalidade......................................................................................................12 Atributo............................................................................................................... 12 Chave Primria....................................................................................................13 Chave Estrangeira...............................................................................................13 Integridade Referencial.......................................................................................13 Deleo Restrita -> .........................................................................................14 Atualizao e Linha Restrita -> ......................................................................14 Operadores Relacionais..........................................................................................15 Sistema de Gerenciamento de Banco de Dados.....................................................19 O Utilitrio PL/SQL Developer.................................................................................20 Query Builder..................................................................................................... 20 A Linguagem SQL...................................................................................................21 Tipos de declaraes SQL.......................................................................................22 DDL (Data Definition Language)..........................................................................22 DML (Data Manipulation Language)....................................................................22
Recomendaes sobre os nomes das tabelas.....................................................23 Tipo de dado das colunas.......................................................................................24 Restries (constrains)...........................................................................................25 Construo bsica de uma consulta.......................................................................26 Expresses aritmticas...........................................................................................27 Nomes alternativos para ttulos de colunas............................................................29 O operador de concatenao.................................................................................30 Literais.................................................................................................................... 30 Manuseio de valores nulos.....................................................................................31 Eliminao de linhas duplicadas.............................................................................33 Ordenao das linhas.............................................................................................34 Critrios de pesquisa..............................................................................................36 Consultas com condies mltiplas........................................................................41 Precedncia dos operadores..................................................................................42 Resumo do comando SELECT.................................................................................43 Funes que manipulam caracteres.......................................................................44 LOWER(coluna | literal)........................................................................................44 UPPER(coluna | literal).........................................................................................44 INITCAP(coluna | literal).......................................................................................44 LPAD(coluna | literal, tamanho, 'caracter')..........................................................45 RPAD(coluna | literal, tamanho, 'caracter')..........................................................45 SUBSTR(coluna | literal, posio, comprimento).................................................45 INSTR(coluna | literal, seqncia de caracteres', posio, n).............................46 LTRIM(coluna | literal, 'caracteres').....................................................................46 RTRIM(coluna | literal, 'caracteres').....................................................................47 SOUNDEX(coluna | literal)...................................................................................47 LENGTH(coluna | literal)......................................................................................47 TRANSLATE(coluna | literal, de, para)..................................................................48 REPLACE(coluna | literal, de, para)......................................................................48
Funes aninhadas..............................................................................................49 Funes numricas.................................................................................................50 ROUND(coluna | literal, n)...................................................................................50 TRUNC(coluna | literal, n)....................................................................................50 CEIL(coluna | literal)............................................................................................51 FLOOR(coluna | literal)........................................................................................51 POWER(coluna | literal, n)...................................................................................51 EXP(coluna | literal).............................................................................................52 LOG(base, coluna | literal)...................................................................................52 LN(coluna | literal)...............................................................................................52 SQRT(coluna | literal)..........................................................................................52 SIGN(coluna | literal)...........................................................................................53 ABS(coluna | literal).............................................................................................53 MOD(valor1, valor2)............................................................................................54 Funes trigonomtricas.....................................................................................54 Funes hiperblicas...........................................................................................54 Funes que manipulam datas...............................................................................56 SYSDATE.............................................................................................................. 56 Aritmtica de datas.............................................................................................56 MONTHS_BETWEEN(data1,data2).......................................................................57 ADD_MONTHS(data, meses)................................................................................57 NEXT_DAY(data, dia_da_semana)........................................................................58 LAST_DAY(data)...................................................................................................58 ROUND(data).......................................................................................................58 TRUNC(data).......................................................................................................59 Funes de converso............................................................................................59 Formatos de Data................................................................................................59 TO_CHAR(nmero|data,['formato']).....................................................................61 Formatos Numricos...........................................................................................62
TO_NUMBER(cadeia_de_caracteres)....................................................................62 TO_DATE('cadeia_de_caracteres','formato')........................................................63 Funes que aceitam qualquer tipo de dado..........................................................63 DECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default).............................63 NVL(coluna|valor, valor)......................................................................................65 GREATEST(coluna|valor, coluna|valor,...)............................................................66 LEAST(coluna|valor, coluna|valor,...)...................................................................66 VSIZE(coluna|valor).............................................................................................66 Funes aninhadas revisitadas...............................................................................67 Usando funes de grupo.......................................................................................68 A clusula GROUP BY...........................................................................................68 Excluindo linhas dos grupos................................................................................69 Grupos dentro de grupos.....................................................................................69 Funes disponveis de grupo.............................................................................70 Funes de grupo e resultados individuais..........................................................71 A clusula HAVING..............................................................................................72 Ordem das clusulas...........................................................................................74 Junes equivalentes..............................................................................................75 Produto................................................................................................................76 Junes no equivalentes....................................................................................77 Regra para juno de tabelas..............................................................................77 Sumrio da Sintaxe.............................................................................................77 Junes externas....................................................................................................79 Juno de uma tabela com ela mesmo................................................................79 Junes verticais................................................................................................. 80 Unio................................................................................................................... 80 Interseo........................................................................................................... 81 Subtrao............................................................................................................ 81 Combinao de operadores.................................................................................81
A clusula ORDER BY...........................................................................................82 Regras para utilizar junes verticais..................................................................82 Definio de consultas aninhadas..........................................................................84 Consultas internas que retornam apenas um valor.............................................84 Como as consultas aninhadas so executadas...................................................85 Consultas internas que retornam mais de um valor............................................85 Operadores ANY e ALL.........................................................................................87 Clusula HAVING com consultas aninhadas........................................................88 Ordenao em consultas aninhadas....................................................................89 Limite para o aninhamento.................................................................................89 Consulta interna correlacionada..........................................................................89 O operador EXISTS..............................................................................................91 Linguagem de Definio de Dados.........................................................................92 Sintaxe do comando:...........................................................................................92 Criao das tabelas do curso:.............................................................................93 Exemplos de restries.......................................................................................93 Criando uma tabela a partir de outra tabela.......................................................95 Alterando uma tabela..........................................................................................97 Trocando o nome de uma tabela.........................................................................98 Descrio das tabelas e colunas.........................................................................98 Removendo tabelas.............................................................................................99 Inserindo novas linhas em uma tabela................................................................99 Atualizando linhas em uma tabela....................................................................103 Eliminando linhas de uma tabela......................................................................104 Viso.....................................................................................................................105 O que uma viso............................................................................................105 Vises simples...................................................................................................105 Vises complexas..............................................................................................105 O comando CREATE VIEW.....................................................................................106
Usando uma viso para operaes de DML..........................................................107 Alterando dados atravs das vises.....................................................................110 Eliminao de vises............................................................................................110 Finalidades dos ndices.........................................................................................112 Estrutura dos ndices.........................................................................................112 Tipos de ndices.................................................................................................112 Criao dos ndices............................................................................................113 Criao de um ndice para melhorar o acesso...................................................113 Criao de um ndice para garantir unicidade...................................................114 Eliminao dos ndices......................................................................................114 Quando um ndice utilizado............................................................................114 ndices e Junes...............................................................................................115 Sugestes para criao dos ndices...................................................................116 O gerador de seqncias......................................................................................117 Gerao de nmeros seqenciais com NEXTVAL..............................................118 Valor atual da seqncia...................................................................................119 Regras para utilizar CURRVAL E NEXTVAL.........................................................119 Alterando uma seqncia..................................................................................120 Concedendo privilgios em seqncias.............................................................121 Eliminando uma seqncia...............................................................................121 Listando seqncias..........................................................................................121 O que uma transao........................................................................................122 Efetivando as mudanas...................................................................................123 Removendo mudanas......................................................................................123 Falhas do sistema..............................................................................................123 O significado de uma transao........................................................................124 Controlando transaes....................................................................................124 COMMIT [WORK]................................................................................................124 SAVEPOINT savepoint_name.............................................................................125
ROLLBACK[WORK] to [SAVEPOINT] savepoint_name.........................................126 Rollback a nvel de declarao..........................................................................126 Rollbacks implcitos...........................................................................................127 Autocommit......................................................................................................127 Exemplo de utilizao de COMMIT e ROLLBACK................................................127 Consistncia de leitura......................................................................................131 Transaes somente de leitura.........................................................................132
Modelagem de Dados
Entidade
Pode ser entendida como uma coisa ou algo da realidade modelada onde deseja-se manter informaes no banco de dados (BD). Por exemplo, em um sistema escolar, algumas entidades podem ser os alunos, professores, horrio, disciplinas e avaliaes. Note que uma entidade pode representar tanto objetos concretos (alunos), quanto objetos abstratos (horrio). A entidade representada por um retngulo, que contm o nome da entidade. Observe o exemplo abaixo.
A entidade ALUNO representa todos os estudantes sobre as quais se deseja manter informaes no BD
Relacionamento
9
Relacionamento um conjunto de associaes entre entidades. O relacionamento representado por um losango. Esse losango ligado por linhas aos retngulos que representam as entidades participantes do relacionamento. O exemplo abaixo possui duas entidades, MDICO e PACIENTE, e um relacionamento chamado CONSULTA.
O modelo acima informa que o BD mantm informaes sobre mdicos, pacientes, alm de um conjunto de associaes (consulta), cada uma ligando um mdico a um paciente.
Um relacionamento pode envolver ocorrncias de uma mesma entidade. Neste caso, estamos diante de um auto-relacionamento. Observe o exemplo:
CASAMENTO um relacionamento que envolve duas ocorrncias da entidade PESSOA. Para facilitar o entendimento, em geral costumamos identificar o papel de cada entidade no relacionamento (para o exemplo, marido e esposa). Cardinalidade do relacionamento Observe o modelo abaixo:
10
Estamos diante de um relacionamento (possui) entre as entidades EMPREGADO e DEPENDENTE. Considere as seguintes questes:
Um empregado pode no ter dependentes? Um dependente pode ter mais de um empregado associado ? Determinado empregado pode possuir mais de um dependente? Pode existir dependente sem algum empregado associado?
Tipos de relacionamento
Existem trs tipos de relacionamento entre entidades:
Relacionamento um-para-um O relacionamento um-para-um usado quando uma entidade A se relaciona com uma entidade B e vice-versa. Este relacionamento representado pelo sinal: 1:1 Veja o exemplo:
Relacionamento um-para-muitos O relacionamento um-para-muitos usado quando uma entidade A pode se relacionar com uma ou mais entidades B. Este relacionamento representado pelo sinal: 1:N Veja o exemplo:
Relacionamento muitos-para-muitos O relacionamento muitos-para-muitos usado quando vrias entidades A se relacionam com vrias entidades B. Este relacionamento representado pelo sinal: N:N ou N:M 11
Veja o exemplo:
Cardinalidade
A cardinalidade um conceito importante para ajudar a definir o relacionamento, ela define o nmero de ocorrncias em um relacionamento. Para determinar a cardinalidade, deve-se fazer a pergunta relacionamento em ambas as direes. No exemplo a seguir, temos: relativa ao
Um departamento possui quantos empregados? - no mnimo 1 e no mximo N. Um empregado est alocado em quantos departamentos? - no mnimo em 1 e no mximo em 1 Somando-se as cardinalidades, definimos o resultado final do relacionamento, ou seja, 1:N
Atributo
Atributo uma caracterstica relevante associada a cada ocorrncia de entidade ou Relacionamento. Observe no modelo abaixo a notao utilizada para atributos:
12
Cardinalidade do atributo
Observe que o modelo acima no informa se determinado aluno pode ter vrios telefones, ou mesmo se algum aluno pode no ter telefones. Para deixar o modelo mais preciso, costumamos expressar cardinalidade para os atributos. Observe a cardinalidade do atributo telefone no modelo abaixo:
Dessa forma, podemos concluir que determinado aluno pode no ter telefone (cardinalidade mnima zero) ou pode ter vrios (cardinalidade mxima N). A cardinalidade dos atributos cdigo e nome (1,1)
Chave Primria
Em toda e qualquer tabela existente em um banco de dados relacional haver sempre uma coluna ou um conjunto de colunas concatenadas, cujos valores so nicos na tabela, isto e, nunca se repete aquele valor em nenhuma outra linha da tabela. Essa coluna ou conjunto de colunas concatenadas identifica uma nica linha da tabela. Entao dizemos que essa coluna ou conjunto de colunas forma a chave primaria da tabela.
Chave Estrangeira
Uma tabela relacional e uma estruturao dos dados por assunto, organizada em tabelas com linhas e colunas, e cada linha e a representao de uma ocorrncia de um objeto, um assunto, descrita por valores em cada coluna. Dessas colunas j sabemos que uma ou um conjunto delas forma o que definimos como o identificados nico de cada linha que e a chave primaria da tabela.
Integridade Referencial
13
Quando colocamos uma coluna como chave estrangeira em uma tabela, assumimos responsabilidade com o banco de dados por assim dizer. As colunas pertencentes a chave estrangeira da tabela A devem ter o mesmo domnio das colunas pertencentes a chave primaria da tabela B. O valor de uma chave estrangeira em uma tabela A deve ser um valor de chave primaria da tabela B, ou ento ser nulo. Sintetizando: uma tabela contem uma chave estrangeira, ento o valor dessa chave so pode ser: Nulo neste caso pode, pois representa a inexistencia de referencia para uma linha da tabela. Igual ao valor de alguma chave primaria na tabela referenciada. Existe um conjunto de regras de operao para um banco de dados que coloca restries, regras de atualizao das tabelas do banco de dados, de forma a garantir e manter a integridade referencial. So elas:
Deleo Restrita -> Ao excluir (deletar) a tabela pai , se ela possuir filhos relacionados (ou seja, se o departamento tiver funcionrios), a excluso e impedida. Isso evita que o bando de dados fique inconsistente, ou seja, linhas de Funcionrio com valor de chave estrangeira inexistente como chave primaria na tabela associada. Outras opes para garantir a integridade de referencias do banco de dados seriam excluir todos os filhos em cascata, fazendo com que todos os funcionrios referenciem um departamento-padro ou fazer com que todos os funcionrios fiquem sem departamento. Incluso e Linha Restrita -> Ao inserir um dado na tabela filha, caso seja obrigatrio que ele j possua dado um dado na tabela ai, ou seja chave estrangeira associada, verifica se ele esta relacionada tabela pai, seno impede a operao. Atualizao e Linha Restrita -> Ao atualizar a chave estrangeira de uma tabela, verifica se existe uma linha da tabela associada que possua como chave primaria o novo valor da chave estrangeira, seno impede essa operao. A opo cascata e sempre perigosa de ser utilizada em banco de dados, pois existe o risco de perder todos os dados existentes em uma determinada tabela se optar por apagar as suas linhas que esto associadas a uma determinada linha que ser deletada da tabela que possui a chave primaria referenciada.
14
Operadores Relacionais
Seleo/Restrio
uma operao que recupera e mostra dados de uma tabela. possvel recuperar todas as linhas, ou apenas algumas que satisfaam uma determinada condio ou a vrias condies. Esta operao chamada tambm de subconjunto horizontal. uma operao que recupera e mostra dados de apenas algumas colunas, e portanto chamada de subconjunto vertical. mostra todas as linhas que aparecem em duas tabelas. mostra todas as linhas que aparecem nas duas tabelas. mostra todas as linhas que aparecem em apenas uma das tabelas o resultado obtido pela concatenao de duas tabelas. Todas as linhas da primeira tabela so concatenadas com todas as linhas da segunda tabela. o resultado obtido pela concatenao de duas tabelas de acordo com condies especficas. Apenas as linhas que atendem as condies estabelecidas so concatenadas.
Projeo
Juno
15
Seleo/Restrio
Projeo
Unio
16
Interseo
Diferena
17
18
O SGBD atua como interface entre os usurios e as informaes armazenadas. Todas as solicitaes relativas aos dados do banco de dados so interceptadas, interpretadas, e executadas pelo SGBD. Nenhum acesso aos dados pode ser feito de outra maneira.
Desta forma, o SGBD isola o usurio de todos os detalhes particulares do hardware ou do sistema operacional sendo utilizado, tais como mtodo de acesso e blocagem de disco. A forma de acesso do usurio ao banco de dados no deve mudar quando o hardware ou o sistema operacional mudam.
Existem modelos alternativos para se implementar um SGBD, sendo que os mais comuns so hierrquico, rede, listas invertidas e relacional.
19
Query Builder
A criao de declaraes SELECT ou a modificao de declaraes j existentes se tornam rpidas e eficientes. Simplesmente clique e arraste tabelas e views, selecione colunas, crie, de modo fcil, clausulas WHERE e ORDER BY, faa join de tabelas baseadas em foreing key e pronto sua consulta j esta criada.
20
A Linguagem SQL
A linguagem SQL a ferramenta bsica para acesso aos dados de um banco de dados relacional. Foi desenvolvida inicialmente nos laboratrios da IBM (1976) sendo atualmente um padro para os SGBD relacionais. Apesar de existirem alguns padres da linguagem SQL, a maioria dos fabricantes de banco de dados criou suas prprias extenses para explorar as caractersticas do banco de dados como o caso da Oracle com o PL/SQL. A SQL considerada como sendo uma linguagem no procedural uma vez que ela processa conjunto de registros e fornece acesso ou navegao automtica de dados. A base para esta linguagem a lgebra relacional, muito embora existam diversas caractersticas importantes que no pertencem a lgebra relacional. Na verdade, a SQL padro deve ser considerada como uma sublinguagem, uma vez que no possui comandos ou declaraes que permitam o controle de repeties ou de desvios condicionais e incondicionais. Para este tipo de controle a Oracle desenvolveu o PL/SQL que consiste em uma extenso da SQL padro.
21
Coman do Create Table Create Index Alter Table Drop Table Drop Index Grant
Funo Cria uma tabela Cria um ndice Altera ou insere uma coluna da tabela Elimina uma tabela do banco de Dados Elimina um ndice Concede privilgios de acesso p/a um usurio
22
A tabela abaixo apresenta alguns dos mais importantes comandos dessa categoria:
Funo Seleciona dados de uma base Insere uma linha em uma tabela Apaga linhas da Tabela Altera o contedo de colunas (campos) da tabela. Grava no disco as alteraes feitas Desfaz as alteraes feitas aps o ltimo commit
Consistncia de singular e plural, no colocando o nome de algumas tabelas no singular e de outras no plural
Usar uma regra consistente para atribuir nomes. Uma regra pode ser, todas as tabelas do sistema financeiro comeam com FIN_.
23
VARCHAR(n)
VARCHAR2(n)
LONG
RAW(n)
DATE
FLOAT
24
Restries (constrains)
So recursos proporcionados pelo SGBD para implementar regras de consistncia bsicas para os dados de uma tabela.
Descrio Especifica o nome da restrio. opcional. Quando omitido o nome padro tem a forma de SYS_Cn, onde 'n' um nmero inteiro atribudo pelo Oracle que identifica unicamente a restrio. Especifica se a coluna pode ou no conter valores nulos. Designa uma coluna, ou uma combinao de colunas, como chave nica. Cada coluna deve ser declarada como NOT NULL, e no podem ser chave primria. Designa uma coluna, ou uma combinao de colunas, como chave primria. As colunas devem ser declaradas como NOT NULL e no podem ter a restrio UNIQUE. Se a chave primria contiver apenas uma coluna pode ser declarada na restrio da coluna. Se a chave primria contiver mltiplas colunas deve ser declarada na restrio da tabela. Identifica a(s) coluna(s) como chave estrangeira . REFERENCES identifica a chave primria ou chave nica que referenciada. Especifica a condio que uma coluna deve satisfazer para a linha ser aceita na tabela. S pode se referenciar a colunas da mesma tabela. Uma restrio de coluna s pode referenciar a uma coluna, porm uma restrio de tabela pode referenciar mltiplas colunas. Desativa (ativa) uma restrio de integridade. O pado a restrio ativa. Identifica a tabela na qual o ORACLE armazena as informaes sobre as linhas que violaram as restries de integridade. A tabela deve existir antes desta condio ser especificada.
PRIMARY KEY
25
a. A clusula SELECT, que lista as colunas a serem envolvidas (essencialmente a Projeo, conforme definido na lgebra relacional).
Para listar os nmeros de todos os departamentos, nomes dos empregados e nmeros dos gerentes da tabela EMP, digita-se:
SQL> SELECT DEPTNO, ENAME, MGR 2 FROM EMP DEPTNO ENAME MGR ------- ---------- ------20 SMITH 7902 30 ALLEN 7698 30 WARD 7698 20 JONES 7839 30 MARTIN 7698 30 BLAKE 7839 10 CLARK 7839 20 SCOTT 7566 10 KING 30 TURNER 7698 20 ADAMS 7788 30 JAMES 7698 20 FORD 7566 10 MILLER 7782 14 rows selected.
possvel selecionar todas as colunas da tabela colocando-se um "*" (asterisco) aps a palavra SELECT, como visto abaixo:
26
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------- ---------- --------- ------- --------- ------- ------- ------7369 SMITH CLERK 7902 13-JUN-83 800 20 7499 ALLEN SALESMAN 7698 15-AUG-83 1600 300 30 7521 WARD SALESMAN 7698 26-MAR-84 1250 500 30 7566 JONES MANAGER 7839 31-OCT-83 2975 20 7654 MARTIN SALESMAN 7698 05-DEC-83 1250 1400 30 7698 BLAKE MANAGER 7839 11-JUN-84 2850 30 7782 CLARK MANAGER 7839 14-MAY-84 2450 10 7788 SCOTT ANALYST 7566 05-MAR-84 3000 20 7839 KING PRESIDENT 09-JUL-84 5000 10 7844 TURNER SALESMAN 7698 04-JUN-84 1500 0 30 7876 ADAMS CLERK 7788 04-JUN-84 1100 20 7900 JAMES CLERK 7698 23-JUL-84 950 30 7902 FORD ANALYST 7566 05-DEC-83 3000 20 7934 MILLER CLERK 7782 21-NOV-83 1300 10 14 rows selected.
Expresses aritmticas
Uma expresso a combinao de um ou mais valores, operadores e funes, que resultam em um valor calculado.
As expresses aritmticas podem conter nomes de colunas, constantes numricas, e operadores aritmticos. Os operadores so + - * e / , para soma, subtrao, multiplicao e diviso, respectivamente.
No exemplo abaixo calcula-se o salrio anual multiplicando-se o salrio mensal por doze.
ENAME SAL*12 COMM ---------- ------- ------SMITH 9600 ALLEN 19200 300 WARD 15000 500 JONES 35700 MARTIN 15000 1400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 0 ADAMS 13200
27
Se a expresso aritmtica contiver mais de um operador, multiplicao e diviso so de mesma precedncia, porm com precedncia superior a adio e subtrao, que tambm so de mesma precedncia. No caso de operadores com a mesma precedncia, o da esquerda processado primeiro.
SQL> SELECT ENAME, SAL+250*12 2 FROM EMP ENAME SAL+250*12 ---------- ---------SMITH 3800 ALLEN 4600 WARD 4250 JONES 5975 MARTIN 4250 BLAKE 5850 CLARK 5450 SCOTT 6000 KING 8000 TURNER 4500 ADAMS 4100 JAMES 3950 FORD 6000 MILLER 4300
Parnteses podem ser utilizados para especificar a ordem na qual os operadores sero executados. Se, por exemplo, for necessrio somar 250 ao salrio antes de multiplicar por 12, devemos escrever:
SQL> SELECT ENAME, (SAL+250)*12 2 FROM EMP ENAME (SAL+250)*12 ---------- -----------SMITH 12600 ALLEN 22200 WARD 18000 JONES 38700 MARTIN 18000 BLAKE 37200 CLARK 32400 SCOTT 39000 KING 63000 TURNER 21000 ADAMS 16200 JAMES 14400 FORD 39000 MILLER 18600
28
O Alis especificado escrevendo-se um texto aps item a ser mostrado na clusula SELECT. Por padro, o nome do Alis convertido para letras maisculas, e no pode conter espaos em branco, a menos que seja colocado entre aspas.
Para mostrar como ttulo da coluna SALARIO ANUAL no lugar de SAL*12, podemos escrever:
SQL> SELECT ENAME NOME, SAL*12 SALARIO ANUAL, COMM 2 FROM EMP NOME SALARIO ANUAL COMM ---------- -------------- ------SMITH 9600 ALLEN 19200 300 WARD 15000 500 JONES 35700 MARTIN 15000 1400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 0 ADAMS 13200 JAMES 11400 FORD 36000 MILLER 15600 14 rows selected.
Nota: somente na clusula SELECT o Alis pode ser usado, nas outras clusulas no.
29
O operador de concatenao
O operador de concatenao (||) permite juntar colunas, expresses aritmticas, ou valores constantes, para criar uma expresso do tipo caracter. Colunas dos dois lados do operador so combinadas para formar uma s coluna.
Para combinar o nmero do empregado com o nome do empregado em uma coluna apenas, utilizando EMPREGADO como ttulo, devemos escrever:
EMPREGADO -------------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER 14 rows selected.
Literais
Um literal qualquer caracter, expresso, ou nmero, incluido na clusula SELECT, que no um nome ou Alis da coluna.
O literal da clusula SELECT listado em todas as linhas mostradas pelo comando. Literais dos tipos data e caracter devem ser envoltos por apstrofos ('). Literais numricos no precisam de apstrofos.
O comando abaixo contm literal concatenado com colunas, e um Alis para a primeira coluna.
30
SQL> COLUMN EMPREGADO FORMAT A20 SQL> SELECT EMPNO||'-'||ENAME EMPREGADO, 2 'TRABALHA NO DEPARTAMENTO', 3 DEPTNO 4 FROM EMP EMPREGADO 'TRABALHANODEPARTAMENTO' DEPTNO -------------------- ------------------------ ------7369-SMITH TRABALHA NO DEPARTAMENTO 20 7499-ALLEN TRABALHA NO DEPARTAMENTO 30 7521-WARD TRABALHA NO DEPARTAMENTO 30 7566-JONES TRABALHA NO DEPARTAMENTO 20 7654-MARTIN TRABALHA NO DEPARTAMENTO 30 7698-BLAKE TRABALHA NO DEPARTAMENTO 30 7782-CLARK TRABALHA NO DEPARTAMENTO 10 7788-SCOTT TRABALHA NO DEPARTAMENTO 20 7839-KING TRABALHA NO DEPARTAMENTO 10 7844-TURNER TRABALHA NO DEPARTAMENTO 30 7876-ADAMS TRABALHA NO DEPARTAMENTO 20 7900-JAMES TRABALHA NO DEPARTAMENTO 30 7902-FORD TRABALHA NO DEPARTAMENTO 20 7934-MILLER TRABALHA NO DEPARTAMENTO 10 14 rows selected.
Se o valor de qualquer coluna envolvida em uma expresso for nulo, o resultado da expresso tambm ser nulo. No exemplo abaixo, somente aparecem os salrios anuais dos vendedores, pois somente estes tem comisso no nula.
SQL> SELECT ENAME, SAL*12+COMM SALARIO_ANUAL 2 FROM EMP ENAME SALARIO_ANUAL ---------- ------------SMITH ALLEN 19500 WARD 15500 JONES MARTIN 16400 BLAKE CLARK SCOTT KING TURNER 18000
31
Para calcular o resultado corretamente, deve ser utilizada a expresso NVL, que converte um valor nulo em um valor no nulo, conforme mostrado abaixo:
SQL> SELECT ENAME, SAL*12+NVL(COMM, 0) SALARIO_ANUAL 2 FROM EMP ENAME SALARIO_ANUAL ---------- ------------SMITH 9600 ALLEN 19500 WARD 15500 JONES 35700 MARTIN 16400 BLAKE 34200 CLARK 29400 SCOTT 36000 KING 60000 TURNER 18000 ADAMS 13200 JAMES 11400 FORD 36000 MILLER 15600 14 rows selected.
a)
uma expresso
b)
um valor no nulo
NVL(ColunaData, 01-jan-84')
NVL(ColunaNumero, 9)
32
NVL(ColunaCaracter, alfanumrico')
Para eliminar as linhas duplicadas, deve ser includa a palavra DISTINCT aps o SELECT.
SQL> SELECT DISTINCT DEPTNO, JOB 2 FROM EMP DEPTNO JOB ------- --------10 CLERK
33
10 10 20 20 20 30 30 30
SQL> SELECT ENAME, JOB, SAL*12, DEPTNO 2 FROM EMP 3 ORDER BY ENAME ENAME JOB SAL*12 DEPTNO ---------- --------- ------- ------ADAMS CLERK 13200 20 ALLEN SALESMAN 19200 30 BLAKE MANAGER 34200 30 CLARK MANAGER 29400 10 FORD ANALYST 36000 20 JAMES CLERK 11400 30 JONES MANAGER 35700 20 KING PRESIDENT 60000 10 MARTIN SALESMAN 15000 30 MILLER CLERK 15600 10 SCOTT ANALYST 36000 20 SMITH CLERK 9600 20 TURNER SALESMAN 18000 30 WARD SALESMAN 15000 30 14 rows selected.
- Nmeros: menores primeiro - Data: - Caracteres: mais cedo primeiro ordem alfabtica 34
Para reverter esta ordem, pode ser utilizada a palavra DESC aps o nome da coluna, na clusula ORDER BY.
Para listarmos os funcionrios mais novos antes dos mais antigos fazemos:
SQL> SELECT ENAME, JOB, HIREDATE 2 FROM EMP 3 ORDER BY HIREDATE DESC ENAME JOB HIREDATE ---------- --------- --------JAMES CLERK 23-JUL-84 KING PRESIDENT 09-JUL-84 BLAKE MANAGER 11-JUN-84 TURNER SALESMAN 04-JUN-84 ADAMS CLERK 04-JUN-84 CLARK MANAGER 14-MAY-84 WARD SALESMAN 26-MAR-84 SCOTT ANALYST 05-MAR-84 MARTIN SALESMAN 05-DEC-83 FORD ANALYST 05-DEC-83 MILLER CLERK 21-NOV-83 JONES MANAGER 31-OCT-83 ALLEN SALESMAN 15-AUG-83 SMITH CLERK 13-JUN-83
possvel efetuar a ordenao por mais de uma coluna, sendo algumas em ordem ascendente e outras em ordem descendente.
SQL> SELECT DEPTNO, JOB, ENAME 2 FROM EMP 3 ORDER BY DEPTNO, SAL DESC DEPTNO JOB ENAME ------- --------- ---------10 PRESIDENT KING 10 MANAGER CLARK 10 CLERK MILLER 20 ANALYST SCOTT 20 ANALYST FORD 20 MANAGER JONES 20 CLERK ADAMS 20 CLERK SMITH 30 MANAGER BLAKE 30 SALESMAN ALLEN 30 SALESMAN TURNER 30 SALESMAN WARD 30 SALESMAN MARTIN 30 CLERK JAMES
35
Critrios de pesquisa
Os critrios de pesquisa so informados na clusula WHERE, que corresponde ao operador Restrio da lgebra relacional. Nesta clusula esto estabelecidos os critrios necessrios para uma linha poder ser selecionada.
A clusula WHERE pode comparar valores em colunas, valores literais, expresses aritmticas, ou funes. Trs elementos so sempre necessrios:
igual maior maior ou igual menor menor ou igual diferente (^= ou !=)
Para listar os nomes, nmeros, cargos e departamentos de todos os funcionrios com cargo CLERK, usamos:
SQL> SELECT ENAME, EMPNO, JOB, DEPTNO 2 FROM EMP 3 WHERE JOB = CLERK'
36
ENAME EMPNO JOB ---------- ------- --------- ------SMITH 7369 CLERK ADAMS 7876 CLERK JAMES 7900 CLERK MILLER 7934 CLERK
DEPTNO 20 20 30 10
Para listar o nome e o nmero dos departamentos com nmero maior que 20, usamos:
SQL> SELECT DNAME, DEPTNO 2 FROM DEPT 3 WHERE DEPTNO > 20 DNAME DEPTNO -------------- ------SALES 30 OPERATIONS 40
SQL> SELECT ENAME, SAL, COMM 2 FROM EMP 3 WHERE COMM > SAL ENAME SAL COMM ---------- ------- ------MARTIN 1250 1400
Existem quatro operadores SQL, que operam sobre todos os tipos de dados.
BETWEEN...AND... entre dois valores (inclusive) IN(lista) LIKE IS NULL idnticos a uma lista de valores semelhante a um modelo de caracteres valor nulo
SQL> SELECT ENAME, SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 ENAME SAL ---------- -------
37
SQL> SELECT EMPNO, ENAME, SAL, MGR 2 FROM EMP 3 WHERE MGR IN ( 7902, 7566, 7788 ) EMPNO ENAME ------- ---------- ------7369 SMITH 7788 SCOTT 7876 ADAMS 7902 FORD SAL MGR ------800 7902 3000 7566 1100 7788 3000 7566
Usando o operador LIKE possvel selecionar linhas de acordo com modelo fornecido. O smbolo "%" representa qualquer seqncia de zero ou mais caracteres. O smbolo "_" (sublinhado) representa qualquer um caracter, mas apenas um, no mnimo e no mximo.
Para listarmos todos os empregados cujos nomes comeam com a letra "S", usamos:
SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME LIKE 'S%' ENAME ---------SMITH SCOTT
Para listar os nomes de todos os empregados que contm exatamente 4 letras, usamos:
SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME LIKE '____' ENAME
38
SQL> SELECT ENAME, MGR 2 FROM EMP 3 WHERE MGR IS NULL ENAME MGR ---------- ------KING
!=
^=
<>
no igual no igual a no maior do que fora da faixa especificada fora da lista especificada no semelhante ao modelo no nulo
NOT NomeDaColuna = NOT NomeDaColuna > NOT BETWEEN NOT IN NOT LIKE IS NOT NULL
Para listar os empregados com salrios fora da faixa de 1000 a 2000, usamos:
SQL> SELECT ENAME, SAL 2 FROM EMP 3 WHERE SAL NOT BETWEEN 1000 AND 2000 ENAME SAL ---------- ------SMITH 800 JONES 2975
39
8 rows selected.
SQL> SELECT ENAME, JOB 2 FROM EMP 3 WHERE JOB NOT LIKE 'M%' ENAME JOB ---------- --------SMITH CLERK ALLEN SALESMAN WARD SALESMAN MARTIN SALESMAN SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK
SQL> SELECT ENAME, MGR 2 FROM EMP 3 WHERE MGR IS NOT NULL ENAME MGR ---------- ------SMITH 7902 ALLEN 7698 WARD 7698 JONES 7839 MARTIN 7698 BLAKE 7839 CLARK 7839 SCOTT 7566 TURNER 7698 ADAMS 7788 JAMES 7698 FORD 7566 MILLER 7782
x <> NULL
x = NULL
40
sempre falso. Nulo nunca igual a nada nem diferente de nada, nem a outro nulo.
Para listar todos os CLERKs com salrio entre 1000 e 2000, usamos:
SQL> SELECT EMPNO, ENAME, JOB, SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 4 AND JOB = 'CLERK' EMPNO ENAME JOB ------- ---------- --------- ------7876 ADAMS CLERK 7934 MILLER CLERK SAL 1100 1300
Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000, usamos:
SQL> SELECT EMPNO, ENAME, JOB, SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 4 OR JOB = CLERK' EMPNO ENAME JOB SAL ------- ---------- --------- ------7369 SMITH CLERK 800 7499 ALLEN SALESMAN 1600 7521 WARD SALESMAN 1250
41
MARTIN SALESMAN 1250 TURNER SALESMAN 1500 ADAMS CLERK 1100 JAMES CLERK 950 MILLER CLERK 1300
Quando aparecem tanto ANDs quanto ORs em uma expresso lgica, todos os ANDs so processados antes que os ORs sejam processados.
Uma vez que AND tem precedncia sobre OR, a consulta abaixo retorna todos os gerentes com salrio maior do que 1500, e todos os vendedores.
SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 2 FROM EMP 3 WHERE SAL > 1500 4 AND JOB = 'MANAGER' 5 OR JOB = 'SALESMAN' EMPNO ENAME JOB SAL DEPTNO ------- ---------- --------- ------- ------7499 ALLEN SALESMAN 1600 30 7521 WARD SALESMAN 1250 30 7566 JONES MANAGER 2975 20 7654 MARTIN SALESMAN 1250 30 7698 BLAKE MANAGER 2850 30 7782 CLARK MANAGER 2450 10 7844 TURNER SALESMAN 1500 30
Para selecionar todos os vendedores e gerentes com salrio superior a 1500, usamos:
SQL> SELECT EMPNO, ENAME, JOB, SAL, DEPTNO 2 FROM EMP 3 WHERE SAL > 1500 4 AND ( JOB = 'MANAGER' OR JOB = SALESMAN' ) EMPNO ENAME JOB SAL DEPTNO ------- ---------- --------- ------- ------7499 ALLEN SALESMAN 1600 30 7566 JONES MANAGER 2975 20 7698 BLAKE MANAGER 2850 30 7782 CLARK MANAGER 2450 10
c) AND
d) OR
Para listar todos os gerentes, de qualquer departamento, e os CLERK do departamento 10 apenas, usamos:
SQL> SELECT * 2 FROM EMP 3 WHERE JOB = MANAGER' OR (JOB = CLERK' AND DEPTNO = 10) EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------- ---------- --------- ------- --------- ------- ------- ------7566 JONES MANAGER 7839 31-OCT-83 2975 20 7698 BLAKE MANAGER 7839 11-JUN-84 2850 30 7782 CLARK MANAGER 7839 14-MAY-84 2450 10 7934 MILLER CLERK 7782 21-NOV-83 1300 10
Neste caso os parnteses so desnecessrios, uma vez que o AND processa primeiro.
43
SQL> SELECT LOWER(DNAME), LOWER('CURSO DE SQL') 2 FROM DEPT LOWER(DNAME) LOWER('CURSODESQL') -------------- -------------------accounting curso de sql research curso de sql sales curso de sql operations curso de sql
UPPER(coluna | literal)
Transforma letras minsculas em maisculas.
SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME = UPPER('smith') ENAME ---------SMITH
INITCAP(coluna | literal)
Transforma a primeira letra da palavra em maiscula e as demais minsculas.
SQL> SELECT INITCAP(DNAME), INITCAP(LOC) 2 FROM DEPT INITCAP(DNAME) INITCAP(LOC) -------------------- -------------------Accounting New York Research Dallas Sales Chicago Operations Boston
44
No exemplo abaixo, as trs colunas so preenchidas esquerda at um total de 20 caracteres. A primeira coluna foi preenchida com asteriscos, a segunda com espaos, e a terceira com pontos. Note que a terceira coluna numrica.
SQL> SELECT LPAD(DNAME, 20, *'), LPAD(DNAME, 20), LPAD(DEPTNO, 20,'.') 2 FROM DEPT LPAD(DNAME,20,*') LPAD(DNAME,20) LPAD(DEPTNO,20,'.') -------------------- -------------------- -------------------**********ACCOUNTING ACCOUNTING ..................10 ************RESEARCH RESEARCH ..................20 ***************SALES SALES ..................30 **********OPERATIONS OPERATIONS ..................40
SQL> SELECT RPAD(DNAME, 20, *'), RPAD(DNAME, 20), RPAD(DEPTNO, 20,'.') 2 FROM DEPT RPAD(DNAME,20,'*') RPAD(DNAME,20) RPAD(DEPTNO,20,'.') -------------------- -------------------- -------------------ACCOUNTING********** ACCOUNTING 10.................. RESEARCH************ RESEARCH 20.................. SALES*************** SALES 30.................. OPERATIONS********** OPERATIONS 40..................
45
SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5) -------------------- --------------- -------------------RACL CCOUNTING COUNT RACL ESEARCH SEARC RACL ALES LES RACL PERATIONS ERATI
Encontra a posio da n-sima ocorrncia a partir da posio indicada, se os quatro parmetros forem fornecidos.
SQL> SELECT DNAME, 2 INSTR(DNAME,'A'), INSTR(DNAME,'ES'), INSTR(DNAME,'C',1,2) 3 FROM DEPT DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2) ------------ ---------------- ----------------- -------------------ACCOUNTING 1 0 3 RESEARCH 5 2 0 SALES 2 4 0 OPERATIONS 5 0 0
SQL> SELECT DNAME, 2 LTRIM(DNAME,'A'), LTRIM(DNAME,'AS'), LTRIM(DNAME,'ASOP') 3 FROM DEPT DNAME LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASOP') -------------- ---------------- ----------------- ------------------ACCOUNTING CCOUNTING CCOUNTING CCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES LES LES OPERATIONS OPERATIONS OPERATIONS ERATIONS
No exemplo acima, na segunda coluna foram removidas as letras "A" esquerda dos nomes dos departamentos. Na terceira coluna foram removidas tanto a letra 46
"A" quanto a letra "S". Na quarta coluna foram removidas as letras "A", "S", "O" e "P" esquerda.
SQL> SELECT DNAME, 2 RTRIM(DNAME,'G'), RTRIM(DNAME,'GHS'), RTRIM(DNAME,'N') 3 FROM DEPT DNAME RTRIM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N') -------------- ---------------- ------------------ ---------------ACCOUNTING ACCOUNTIN ACCOUNTIN ACCOUNTING RESEARCH RESEARCH RESEARC RESEARCH SALES SALES SALE SALES OPERATIONS OPERATIONS OPERATION OPERATIONS
SOUNDEX(coluna | literal)
Retorna uma seqncia de caracteres que representa o som das palavras contidas na coluna ou no literal.
SQL> SELECT ENAME, SOUNDEX(ENAME) 2 FROM EMP 3 WHERE SOUNDEX(ENAME) = SOUNDEX('FRED') ENAME SOUNDEX(ENAME) ---------- -------------------FORD F630
LENGTH(coluna | literal)
Retorna o nmero de caracteres (ou dgitos) na coluna ou literal especificados.
SQL> SELECT LENGTH('CURSO DE SQL'), LENGTH(DEPTNO), LENGTH(DNAME) 2 FROM DEPT LENGTH('CURSODESQL') LENGTH(DEPTNO) --------------------- --------------------- --------------------LENGTH(DNAME)
47
12 12 12 12
2 2 2 2
10 8 5 10
No exemplo abaixo foram trocados os caracteres "C" por "P" nos nomes dos funcionrios.
SQL> SELECT ENAME, TRANSLATE(ENAME,'C','P') 2 FROM EMP 3 WHERE DEPTNO = 10 ENAME TRANSLATE(ENAME,'C','P') ---------- ------------------------CLARK PLARK KING KING MILLER MILLER
No exemplo abaixo foram trocados "A" por "I", e "R" por "T", nos cargos.
SQL> SELECT JOB, TRANSLATE(JOB,'AR','IT') 2 FROM EMP 3 WHERE DEPTNO = 10 JOB TRANSLATE(JOB,'AR','IT') --------- -----------------------------MANAGER MINIGET PRESIDENT PTESIDENT CLERK CLETK
48
JOB REPLACE(JOB,'SALESMAN','VENDEDOR') --------- ---------------------------------------CLERK CLERK SALESMAN VENDEDOR SALESMAN VENDEDOR MANAGER MANAGER SALESMAN VENDEDOR MANAGER MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT PRESIDENT SALESMAN VENDEDOR CLERK CLERK CLERK CLERK ANALYST ANALYST CLERK CLERK 14 rows selected.
Funes aninhadas
As funes que operam sobre uma nica linha podem ser aninhadas, sendo que neste caso as funes internas so executadas antes das externas.
49
SQL> SELECT DNAME, LENGTH(DNAME), 2 LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A')) 3 FROM DEPT DNAME LENGTH(DNAME)LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A')) ---------- -----------------------------------------------------------ACCOUNTING 10 0 RESEARCH 8 1 SALES 5 2 OPERATIONS 10 1
Funes numricas
ROUND(coluna | literal, n)
Arredonda o valor da coluna ou do literal na n-sima casa decimal. Se n for negativo eqivale s dezenas. Se n for omitido eqivale a um nmero inteiro.
SQL> SELECT ROUND(45.923,1), ROUND(45.923), ROUND(42.323,-1), ROUND(SAL/32,2) 2 FROM EMP 3 WHERE DEPTNO = 10 ROUND(45.923,1) ROUND(45.923) ROUND(42.323,-1) ROUND(SAL/32,2) ----------------- ----------------- ----------------- ----------------45.9 46 40 76.56 45.9 46 40 156.25 45.9 46 40 40.63
TRUNC(coluna | literal, n)
Trunca o valor da coluna ou do literal na n-sima posio.
SQL> SELECT TRUNC(45.923,1), TRUNC(45.923), TRUNC(42.323,-1), TRUNC(SAL/32,2) 2 FROM EMP 3 WHERE DEPTNO = 10 TRUNC(45.923,1) TRUNC(45.923) TRUNC(42.323,-1) TRUNC(SAL/32,2) ----------------- ----------------- ----------------- ----------------45.9 45 40 76.56 45.9 45 40 156.25 45.9 45 40 40.62
50
CEIL(coluna | literal)
Retorna o menor inteiro maior ou igual ao valor da coluna ou do literal.
SQL> SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1) 2 FROM EMP 3 WHERE SAL BETWEEN 3000 AND 5000 CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1) --------- ---------- ------------ ----------3000 100 102 -11 5000 100 102 -11 3000 100 102 -11
FLOOR(coluna | literal)
Retorna o maior inteiro menor ou igual ao valor da coluna ou literal.
SQL> SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1) 2 FROM EMP 3 WHERE FLOOR(SAL) BETWEEN 3000 AND 5000
FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1) ---------- ----------- ------------- -----------3000 99 101 -12 5000 99 101 -12 3000 99 101 -12
POWER(coluna | literal, n)
Eleva a coluna ou literal a n-sima potncia.
SQL> SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5) 2 FROM EMP 3 WHERE DEPTNO = 10 SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5) ----------------- ----------------- ----------------- ----------------2450 6002500 14706125000 312500000 5000 25000000 125000000000 312500000 1300 1690000 2197000000 312500000
51
EXP(coluna | literal)
Eleva e (2.71828183...) coluna ou literal.
LN(coluna | literal)
Calcula o logaritmo neperiano da coluna ou do literal.
SQRT(coluna | literal)
Retorna a raiz quadrada da coluna ou do literal.
SQL> SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM) 2 FROM EMP 3 WHERE COMM > 0
52
SAL SQRT(SAL) SQRT(40) SQRT(COMM) ---- ----------------- ----------------- ----------------1600 40 6.324555320336759 17.32050807568877 1250 35.35533905932738 6.324555320336759 22.3606797749979 1250 35.35533905932738 6.324555320336759 37.41657386773941
SIGN(coluna | literal)
Retorna -1 se o valor da coluna ou do literal for negativo, retorna 0 se for igual a zero, ou retorna 1 se for maior do que zero.
SQL> SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL) 2 FROM EMP 3 WHERE DEPTNO = 30 SAL-COMM SIGN(SAL-COMM) COMM-SAL ----------------- ----------------- ----------------- ----------------1300 1 -1300 -1 750 1 -750 -1 -150 -1 150 1 1500 1 -1500 -1 SIGN(COMM-SAL)
Salrios maiores do que a comisso podem ser listados conforme mostrado abaixo:
SQL> SELECT ENAME, SAL, COMM 2 FROM EMP 3 WHERE SIGN(SAL-COMM) = 1 ENAME SAL COMM ---------- ----------------- ----------------ALLEN 1600 300 WARD 1250 500 TURNER 1500 0
ABS(coluna | literal)
Retorna o valor absoluto da coluna ou do literal.
SQL> SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL) 2 FROM EMP 3 WHERE DEPTNO = 30 SAL COMM COMM-SAL ABS(COMM-SAL) ----------------- ----------------- ----------------- ----------------1600 300 -1300 1300 1250 500 -750 750 1250 1400 150 150
53
-1500
1500
MOD(valor1, valor2)
Retorna o resto da diviso de valor1 por valor2.
SQL> SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40) 2 FROM EMP 3 WHERE DEPTNO = 30 4 ORDER BY COMM SAL COMM MOD(SAL,COMM) MOD(100,40) ----------------- ----------------- ----------------- ----------------1500 0 1500 20 1600 300 100 20 1250 500 250 20 1250 1400 1250 20 2850 20 950 20
Funes trigonomtricas
Calculam o seno (SIN), coseno (COS), e tangente (TAN) da coluna ou literal.
SELECT SIN(30*3.141592654/180), COS(60*3.141592654/180), TAN(45*3.141592654/180) FROM DUAL SIN(30*3.1 COS(60*3.1 TAN(45*3.1 ---------------------------.5 .5 1
Funes hiperblicas
Calculam o seno hiperblico (SINH), coseno hiperblico (COSH) e tangente hiperblica (TANH) da coluna ou literal.
54
1.17520119
.462117157
55
Aritmtica de datas
Datas podem ser somadas ou subtradas de outras datas, ou de valores numricos.
Soma o nmero de dias data, produzindo outra data Subtrai o nmero de dias data, produzindo outra data Subtrai uma data da outra, produzindo nmero de dias Soma nmero de horas data, produzindo outra data
SQL> SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE-HIREDATE 2 FROM EMP 3 WHERE HIREDATE LIKE '%JUN%' HIREDATE HIREDATE+7 HIREDATE-7 SYSDATE-HIREDATE --------- ---------- ---------- ----------------13-JUN-83 20-JUN-83 06-JUN-83 4152.351851851852 11-JUN-84 18-JUN-84 04-JUN-84 3788.351851851852 04-JUN-84 11-JUN-84 28-MAY-84 3795.351851851852 04-JUN-84 11-JUN-84 28-MAY-84 3795.351851851852
56
A operao SYSDATE-HIREDATE retorna o nmero de dias entre a admisso do empregado e a data atual.
MONTHS_BETWEEN(data1,data2)
Retorna o nmero de meses decorridos entre data1 e data2.
SQL> SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE), 2 MONTHS_BETWEEN('01-JAN-84','05-NOV-88') 3 FROM EMP 4 WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE) > 59 MONTHS_BETWEEN(SYSDATE,HIREDATE) MONTHS_BETWEEN('01-JAN-84','05-NOV-88' -------------------------------- -------------------------------------136.3985293458781 -58.1290322580645 134.3340132168459 -58.1290322580645 126.9791745071685 -58.1290322580645 131.8178841845878 -58.1290322580645 130.6565938620072 -58.1290322580645 124.4630454749104 -58.1290322580645 125.366271281362 -58.1290322580645 127.6565938620072 -58.1290322580645 123.5275616039427 -58.1290322580645 124.6888519265233 -58.1290322580645 124.6888519265233 -58.1290322580645 123.0759487007168 -58.1290322580645 130.6565938620072 -58.1290322580645 131.1404648297491 -58.1290322580645 14 rows selected.
ADD_MONTHS(data, meses)
Adiciona o nmero de meses especificados data.
SQL> SELECT HIREDATE, ADD_MONTHS(HIREDATE,3), ADD_MONTHS(HIREDATE,-3) 2 FROM EMP 3 WHERE DEPTNO=20 HIREDATE ADD_MONTHS(HIREDATE,3) ADD_MONTHS(HIREDATE,-3) --------- ---------------------- ----------------------13-JUN-83 13-SEP-83 13-MAR-83 31-OCT-83 31-JAN-84 31-JUL-83 05-MAR-84 05-JUN-84 05-DEC-83 04-JUN-84 04-SEP-84 04-MAR-84 05-DEC-83 05-MAR-84 05-SEP-83
57
NEXT_DAY(data, dia_da_semana)
Data do prximo dia da semana aps data.
SQL> SELECT HIREDATE, NEXT_DAY(HIREDATE,'FRIDAY'), NEXT_DAY(HIREDATE,6) 2 FROM EMP 3 WHERE DEPTNO = 10 HIREDATE NEXT_DAY(HIREDATE,'FRIDAY') NEXT_DAY(HIREDATE,6) --------- --------------------------- -------------------14-MAY-84 18-MAY-84 18-MAY-84 09-JUL-84 13-JUL-84 13-JUL-84 21-NOV-83 25-NOV-83 25-NOV-83
LAST_DAY(data)
Retorna a data do ltimo dia do ms da data especificada.
SQL> SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, 2 LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88') 3 FROM EMP 4 WHERE DEPTNO = 20
SYSDATE LAST_DAY HIREDATE LAST_DAY LAST_DAY (SYSDATE) (HIREDATE) ('15-FEB-88') --------- ---------- --------- ---------- ------------25-OCT-94 31-OCT-94 13-JUN-83 30-JUN-83 29-FEB-88 25-OCT-94 31-OCT-94 31-OCT-83 31-OCT-83 29-FEB-88 25-OCT-94 31-OCT-94 05-MAR-84 31-MAR-84 29-FEB-88 25-OCT-94 31-OCT-94 04-JUN-84 30-JUN-84 29-FEB-88 25-OCT-94 31-OCT-94 05-DEC-83 31-DEC-83 29-FEB-88
ROUND(data)
ROUND(data, 'MONTH') ROUND(data, 'YEAR')
ROUND(data) retorna a data com a indicao da hora como sendo zero horas (meia noite). At o meio dia retorna a mesma data, aps o meio dia retorna o dia seguinte. Esta funo til quando so comparadas datas com horas diferentes.
58
ROUND(data, 'MONTH') retorna o primeiro dia do ms da data, se a data estiver na primeira quinzena, ou retorna o primeiro dia do ms seguinte, se a data estiver na segunda quinzena.
ROUND(data, 'YEAR') retorna o primeiro dia do ano da data, se a data estiver no primeiro semestre, ou retorna o primeiro dia do ano seguinte, se a data estiver no segundo semestre.
SQL> SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') 2 FROM SYS.DUAL SYSDATE ROUND(SYSDATE,'MONTH') ROUND(SYSDATE,'YEAR') --------- ---------------------- --------------------25-OCT-94 01-NOV-94 01-JAN-95
TRUNC(data)
TRUNC(data, 'MONTH') TRUNC(data, 'YEAR')
TRUNC(data) retorna a data com o tempo indicando zero horas. TRUNC(data,'MONTH') retorna o primeiro dia do ms da data. TRUNC(data,'YEAR') retorna o primeiro dia do ano da data.
SQL> SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR') 2 FROM SYS.DUAL SYSDATE TRUNC(SYSDATE,'MONTH') TRUNC(SYSDATE,'YEAR') --------- ---------------------- --------------------25-OCT-94 01-OCT-94 01-JAN-94
Funes de converso
Formatos de Data
Formato CC ou SCC YYYY ou SYYYY YYY, YY, Y Significado Sculo; S prefixa datas Antes de Cristo com "-" Ano; S prefixa datas Antes de Cristo com "-" ltimos 3,2,1 dgitos do ano
59
Y,YYY YEAR ou SYEAR BC ou AD B.C. ou A.D. Q MM Month MON WW ou W DDD, DD, D DAY DY J AM ou PM A.M. ou P.M. HH ou HH12 HH24 MI SS SSSS /., etc... "..."
Ano com vrgula separando os milhares Ano por extenso. S prefixa datas Antes de Cristo com "-" Indicador de Antes ou Depois de Cristo Idntico a BC/AD com pontos Quarto do ano (trimestre) Ms Ms por extenso, com 9 caracteres, espaos direita Nome do ms, com 3 caracteres Semana do ano ou do ms Dia do ano, do ms, ou da semana Dia por extenso, com 9 caracteres, espaos direita Nome do dia, abreviado com 3 caracteres Dia Juliano (dias desde 31/12/4713 AC) Indicador de meridiano Indicador de meridiano com pontos Hora do dia no intervalo 1 a 12 Hora do dia no intervalo 0 a 23 Minuto Segundo Segundos aps meia noite (0-86399) Pontuao reproduzida no resultado Caracteres entre aspas reproduzido no resultado
Notas:
1 - O prefixo 'fm' (fill mode) antes de MONTH ou DAY suprime os espaos direita
60
4 - O sufixo 'SPTH' para nmeros ordinais por extenso ("DDSPTH" para "FOURTH")
TO_CHAR(nmero|data,['formato'])
Converte nmero ou data em caracter no formato especificado.
SQL> SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') 2 FROM SYS.DUAL TO_CHAR(SYSDATE,'DAYDDTHMONTHYYYY') ----------------------------------TUESDAY ,25TH OCTOBER 1994
Adicionando-se o prefixo fm (fill mode) para remover os espaos, e utilizando-se letras maisculas e minsculas temos:
SQL> SELECT TO_CHAR(SYSDATE, 'fmDay, ddth Month YYYY') 2 FROM SYS.DUAL TO_CHAR(SYSDATE,'FMDAY,DDTHMONTHYYYY') -------------------------------------Tuesday, 25th October 1994
A funo TO_CHAR pode ser usada para extrair a hora do dia apenas.
A funo TO_CHAR pode ser usada para converter nmeros em caracteres aplicando a formatao desejada.
61
TO_CHAR(SAL,'$9,999') --------------------$800 $1,600 $1,250 $2,975 $1,250 $2,850 $2,450 $3,000 $5,000 $1,500 $1,100 $950 $3,000 $1,300 14 rows selected.
Formatos Numricos
Format o 9 0 $ . , MI PR EEEE V B Significado posio numrica (um 9 para cada nmero) zeros esquerda cifro esquerda ponto decimal na posio especificada vrgula na posio especificada sinal de menos direita nmeros negativos entre parnteses notao cientfica multiplicar por 10 elevado a n, sendo n o nmero de 9 direita de V mostrar resultados zero como espaos, no como 0. 999999 099999 $99999 999999.99 999,999 099999MI 999999PR 99.999EEE E 9999V99 B9999.99 Exemplo 1234 001234 $1234 1234.00 1,234 1234(1234) 1.234E+0 3 123400 1234.00
TO_NUMBER(cadeia_de_caracteres)
Converte a cadeia de caracteres, que deve conter um nmero, em um valor numrico. 62
SQL> SELECT EMPNO, ENAME, JOB, SAL 2 FROM EMP 3 WHERE SAL > TO_NUMBER('1500') EMPNO ENAME JOB SAL ----- ---------- --------- ------7499 ALLEN SALESMAN 1600 7566 JONES MANAGER 2975 7698 BLAKE MANAGER 2850 7782 CLARK MANAGER 2450 7788 SCOTT ANALYST 3000 7839 KING PRESIDENT 5000 7902 FORD ANALYST 3000 7 rows selected.
TO_DATE('cadeia_de_caracteres','formato')
Retorna a data contida na cadeia de caracteres conforme o formato especificado. Se o formato for omitido ser assumido DD-MON-YY.
SQL> SELECT EMPNO, ENAME, HIREDATE 2 FROM EMP 3 WHERE HIREDATE = TO_DATE('June 4,1984','Month dd,yyyy') EMPNO ENAME HIREDATE ----- ---------- --------7844 TURNER 04-JUN-84 7876 ADAMS 04-JUN-84
Argumentos:
coluna|expresso a coluna ou expresso a ser avaliada pes1 o primeiro valor a ser testado 63
o valor a ser retornado se coluna ou expresso igual a o segundo valor a ser testado o valor a ser retornado se coluna ou expresso igual a o valor a ser retornado se a coluna ou expresso de pes1, pes2,...,pesN.
Notas:
-O valor retornado sempre do mesmo tipo do terceiro argumento (resultado1) No exemplo abaixo o cargo CLERK transformado em WORKER, o cargo MANAGER transformado em BOSS, e os demais cargos so transformados em UNDEFINED.
SQL> SELECT ENAME, JOB, 2 DECODE(JOB, 'CLERK','WORKER','MANAGER','BOSS','UNDEFINED') 3 DECODED_JOB 4 FROM EMP ENAME JOB DECODED_JOB ---------- --------- ----------SMITH CLERK WORKER ALLEN SALESMAN UNDEFINED WARD SALESMAN UNDEFINED JONES MANAGER BOSS MARTIN SALESMAN UNDEFINED BLAKE MANAGER BOSS CLARK MANAGER BOSS SCOTT ANALYST UNDEFINED KING PRESIDENT UNDEFINED TURNER SALESMAN UNDEFINED ADAMS CLERK WORKER JAMES CLERK WORKER FORD ANALYST UNDEFINED MILLER CLERK WORKER
SQL> SELECT GRADE, 2 DECODE(GRADE,'1','15%','2','10%','3','8%','5%') BONUS 3 FROM SALGRADE GRADE BONUS ----- ----1 15% 2 10% 3 8% 4 5% 5 5%
O exemplo abaixo causa um erro porque ename (caracter) tem tipo diferente do terceiro argumento sal (numrico).
SQL> SELECT * FROM EMP 2 ORDER BY DECODE(2,1,SAL,2,ENAME,SAL) * ERROR: ORA-01722: invalid number no rows selected
SQL> SELECT JOB, SAL, 2 DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15, 3 'MANAGER',SAL*0.95, SAL) SALARIO_DECODIFICADO 4 FROM EMP JOB SAL SALARIO_DECODIFICADO --------- ------- -------------------CLERK 800 920 SALESMAN 1600 1600 SALESMAN 1250 1250 MANAGER 2975 2826.25 SALESMAN 1250 1250 MANAGER 2850 2707.5 MANAGER 2450 2327.5 ANALYST 3000 3300 PRESIDENT 5000 5000 SALESMAN 1500 1500 CLERK 1100 1265 CLERK 950 1092.5 ANALYST 3000 3300 CLERK 1300 1495 14 rows selected.
NVL(coluna|valor, valor)
65
GREATEST(coluna|valor, coluna|valor,...)
Retorna o maior dos valores de uma lista de valores.
SQL> SELECT GREATEST(1000,2000), GREATEST(SAL,COMM) 2 FROM EMP 3 WHERE DEPTNO = 30 GREATEST(1000,2000) GREATEST(SAL,COMM) ------------------- -----------------2000 1600 2000 1250 2000 1400 2000 2000 1500 2000 6 rows selected.
LEAST(coluna|valor, coluna|valor,...)
Retorna o menor dos valores de uma lista de valores. SQL> SELECT LEAST(1000,2000), LEAST(SAL,COMM) 2 FROM EMP 3 WHERE DEPTNO = 30 LEAST(1000,2000) LEAST(SAL,COMM) ----------------- ----------------1000 300 1000 500 1000 1250 1000 1000 0 1000
VSIZE(coluna|valor)
66
Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o valor.
SQL> SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), 2 VSIZE(SAL), VSIZE(ENAME) 3 FROM EMP 4 WHERE DEPTNO = 10 DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE) VSIZE(SAL) ------- --------------- --------------- --------------- --------------10 2 7 3 5 10 2 7 2 4 10 2 7 2 6 VSIZE(ENAME)
67
Note que toda a tabela EMP foi tratada como um nico grupo.
Uma funo de grupo pode ser aplicada sobre um subconjunto das linhas usando a clusula WHERE.
A clusula GROUP BY
A clusula GROUP BY utilizada para dividir as linhas das tabelas em grupos. Funes de grupo podem ser utilizadas para retornar informaes sumarizadas para cada grupo.
68
SQL> SELECT JOB, AVG(SAL) 2 FROM EMP 3 GROUP BY JOB JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5 MANAGER 2758.333333333333 PRESIDENT 5000 SALESMAN 1400
SQL> SELECT JOB, AVG(SAL) 2 FROM EMP 3 WHERE JOB != 'MANAGER' 4 GROUP BY JOB JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5 PRESIDENT 5000 SALESMAN 1400
SQL> SELECT DEPTNO, JOB, AVG(SAL) 2 FROM EMP 3 GROUP BY DEPTNO, JOB DEPTNO JOB AVG(SAL) ----------------- --------- -----------------
69
10 10 10 20 20 20 30 30 30
9 rows selected.
Quando DISTINCT especificado, somente os valores no duplicados so considerados pela funo, caso contrrio ALL assumido, considerando todos os valores, inclusive os duplicados.
70
Podem ser fornecidas expresses dos tipos caracter, nmero ou data quando 'exp' estiver indicado. Quando 'n' estiver indicado, somente valores numricos so aceitos.
SQL> SELECT MAX(SAL) 2 FROM EMP 3 GROUP BY JOB MAX(SAL) ----------------3000 1300 2975 5000 1600
SQL> SELECT MAX(SAL), JOB 2 FROM EMP 3 GROUP BY JOB MAX(SAL) JOB ----------------- --------3000 ANALYST 1300 CLERK 2975 MANAGER 5000 PRESIDENT 1600 SALESMAN
Lembre-se que quando funes de grupo so includas na clusula SELECT, todas as colunas que no contm funo de grupo devem aparecer na clusula GROUP BY.
O exemplo abaixo mostra o erro causado pela utilizao da funo de grupo MIN(SAL), sem haver a clusula GROUP BY em DEPTNO: 71
SQL> SELECT DEPTNO, MIN(SAL) 2 FROM EMP SELECT DEPTNO, MIN(SAL) * ERROR at line 1: ORA-00937: not a single-group group function
SQL> SELECT DEPTNO, MIN(SAL) 2 FROM EMP 3 GROUP BY DEPTNO DEPTNO MIN(SAL) ----------------- ----------------10 1300 20 800 30 950
Toda coluna ou expresso da clusula SELECT que no uma funo de agregao deve aparecer na clusula GROUP BY.
A clusula HAVING
Somente os grupos que atendem as condies especificadas na clusula HAVING so selecionados. A clusula HAVING opera sobre a clusula GROUP BY de maneira semelhante a que a clusula WHERE opera sobre a clusula SELECT.
Para mostrar o salrio mdio dos departamento que possuem mais de trs funcionrios:
SQL> SELECT DEPTNO, AVG(SAL) 2 FROM EMP 3 GROUP BY DEPTNO 4 HAVING COUNT(*) > 3 DEPTNO AVG(SAL) ----------------- ----------------20 2175 30 1566.666666666667
SQL> SELECT JOB, MAX(SAL) 2 FROM EMP 3 HAVING MAX(SAL) >= 3000 4 GROUP BY JOB JOB MAX(SAL) --------- ----------------ANALYST 3000 PRESIDENT 5000
Embora a clusula HAVING possa ser escrita antes da clusula GROUP BY, a leitura torna-se mais fcil quando a clusula HAVING aparece aps a clusula GROUP BY. Os grupos so formados e as funes de grupo so calculadas antes da clusula HAVING ser aplicada.
A clusula WHERE no pode ser usada para restringir os grupos a serem retornados. A clusula WHERE na declarao abaixa ilegal:
SQL> SELECT DEPTNO, AVG(SAL) 2 FROM EMP 3 WHERE AVG(SAL) > 2000 4 GROUP BY DEPTNO WHERE AVG(SAL) > 2000 * ERROR at line 3: ORA-00934: group function is not allowed here
SQL> SELECT DEPTNO, AVG(SAL) 2 FROM EMP 3 GROUP BY DEPTNO 4 HAVING AVG(SAL) > 2000 DEPTNO AVG(SAL) ----------------- ----------------10 2916.666666666667 20 2175
A clusula WHERE utilizada para aplicar restries sobre linhas individualmente, enquanto a clusula HAVING utilizada para aplicar restries sobre grupos de linhas.
73
SQL> SELECT JOB, AVG(SAL) 2 FROM EMP 3 WHERE JOB <> 'MANAGER' 4 GROUP BY JOB 5 HAVING AVG(SAL) > 2000 JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5 PRESIDENT 5000
So avaliados:
para ficar somente as linhas que atendem a clusula para montagem dos grupos para ficar somente os grupos que atendem a clusula
74
Junes equivalentes
Para levantar, manualmente, o nome do departamento em que um funcionrio trabalha, primeiro seria levantado na tabela EMP o nmero do departamento do empregado, e, em seguida, seria levantado na tabela DEPT o nome correspondente ao nmero do departamento. Este relacionamento entre as duas tabelas chamado de juno equivalente (equi-join), uma vez o nmero do departamento nas duas tabelas o mesmo.
SQL> SELECT ENAME, JOB, DNAME 2 FROM EMP, DEPT 3 WHERE EMP.DEPTNO = DEPT.DEPTNO ENAME JOB DNAME ---------- --------- -------------CLARK MANAGER ACCOUNTING KING PRESIDENT ACCOUNTING MILLER CLERK ACCOUNTING SMITH CLERK RESEARCH ADAMS CLERK RESEARCH FORD ANALYST RESEARCH SCOTT ANALYST RESEARCH JONES MANAGER RESEARCH ALLEN SALESMAN SALES BLAKE MANAGER SALES MARTIN SALESMAN SALES JAMES CLERK SALES TURNER SALESMAN SALES WARD SALESMAN SALES
As linhas da tabela EMP foram combinadas com as linhas da tabela DEPT para obteno dos nmeros dos departamentos.
O nome da tabela colocado antes do nome da coluna, para diferenciar colunas com mesmo nome em tabelas diferentes.
Todas as colunas podem ser prefixadas com o nome da tabela, porm este procedimento s obrigatrio quando existe ambigidade.
75
3 WHERE EMP.DEPTNO = DEPT.DEPTNO 4 ORDER BY DEPT.DEPTNO DEPTNO ENAME JOB DNAME ------- ---------- --------- -------------10 CLARK MANAGER ACCOUNTING 10 KING PRESIDENT ACCOUNTING 10 MILLER CLERK ACCOUNTING 20 SMITH CLERK RESEARCH 20 ADAMS CLERK RESEARCH 20 FORD ANALYST RESEARCH 20 SCOTT ANALYST RESEARCH 20 JONES MANAGER RESEARCH 30 ALLEN SALESMAN SALES 30 BLAKE MANAGER SALES 30 MARTIN SALESMAN SALES 30 JAMES CLERK SALES 30 TURNER SALESMAN SALES 30 WARD SALESMAN SALES 14 rows selected.
Alis para nomes de tabelas podem ser usado de forma semelhante que foi usada para alis de nomes de colunas. O nome do alis escrito aps o nome da tabela. No exemplo abaixo foi utilizado o alis 'E' para a tabela EMP, e o alis 'D' para a tabela DEPT.
SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME 2 FROM EMP E, DEPT D 3 WHERE E.DEPTNO = D.DEPTNO 4 ORDER BY D.DEPTNO ENAME DEPTNO DNAME ---------- ------- -------------CLARK 10 ACCOUNTING KING 10 ACCOUNTING MILLER 10 ACCOUNTING SMITH 20 RESEARCH ADAMS 20 RESEARCH FORD 20 RESEARCH SCOTT 20 RESEARCH JONES 20 RESEARCH ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 14 rows selected.
Produto
Quando a condio de juno invlida ou omitida completamente, o resultado um Produto Cartesiano, e todas as combinaes de linha sero retornadas. 76
Junes no equivalentes
O relacionamento entre as tabelas EMP e SALGRADE formam uma juno no equivalente, uma vez que no existe nenhuma coluna comum s duas tabelas. No exemplo, a funo BETWEEN ... AND ... faz o relacionamento entre as duas tabelas.
SQL> SELECT E.ENAME, E.SAL, S.GRADE 2 FROM EMP E, SALGRADE S 3 WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL ENAME SAL GRADE ---------- ------- ------SMITH 800 1 ADAMS 1100 1 JAMES 950 1 WARD 1250 2 MARTIN 1250 2 MILLER 1300 2 ALLEN 1600 3 TURNER 1500 3 JONES 2975 4 BLAKE 2850 4 CLARK 2450 4 SCOTT 3000 4 FORD 3000 4 KING 5000 5
Sumrio da Sintaxe
[condio de linha]... [outra condio de linha] {expresso|coluna} {condio de grupo} {expresso|coluna} [ASC|DESC]
78
Junes externas
Se uma linha no satisfaz a condio de juno, ento a linha no mostrada no resultado da consulta. De fato, quando fazemos a juno equivalente (equi-join) das tabelas EMP e DEPT, o departamento 40 no aparece, uma vez que no h nenhum empregado lotado neste departamento.
As linhas excludas podem ser retornadas se um operador de juno externa (outer join) for utilizado na condio de juno. O operador um sinal de '+' colocado entre parnteses, que deve ser ficar ao lado da tabela onde as informaes que no seriam includas devem aparecer.
No exemplo o operador est colocado ao lado da tabela DEPT, forando listar os dados dos departamentos mesmo que no haja correspondncia em EMP.
SQL> SELECT E.ENAME, D.DEPTNO, D.DNAME 2 FROM EMP E, DEPT D 3 WHERE E.DEPTNO (+) = D.DEPTNO 4 AND D.DEPTNO IN (30,40) ENAME DEPTNO DNAME ---------- ------- -------------ALLEN 30 SALES BLAKE 30 SALES MARTIN 30 SALES JAMES 30 SALES TURNER 30 SALES WARD 30 SALES 40 OPERATIONS 7 rows selected.
O operador de juno externa (outer join) s pode aparecer em um dos lados da expresso, causando uma juno externa esquerda (left outer join), ou uma juno externa direita (right outer join). A juno externa completa (outer join) no implementada diretamente pelo Oracle.
79
No exemplo abaixo so mostrados todos os funcionrios que recebem menos que seus gerentes.
SQL> SELECT E.ENAME EMP_NOME, E.SAL EMP_SAL, 2 G.ENAME GER_NOME, G.SAL GER_SAL 3 FROM EMP E, EMP G 4 WHERE E.MGR = G.EMPNO AND E.SAL < G.SAL EMP_NOME EMP_SAL GER_NOME GER_SAL ---------- ------- ---------- ------ALLEN 1600 BLAKE 2850 WARD 1250 BLAKE 2850 JAMES 950 BLAKE 2850 TURNER 1500 BLAKE 2850 MARTIN 1250 BLAKE 2850 MILLER 1300 CLARK 2450 ADAMS 1100 SCOTT 3000 JONES 2975 KING 5000 CLARK 2450 KING 5000 BLAKE 2850 KING 5000 SMITH 800 FORD 3000 11 rows selected.
Note que EMP aparece na clusula FROM duas vezes, uma com o alis 'E', para os empregados, e outra com o alis 'G', para os gerentes.
Junes verticais
Os operadores UNION, INTERSECT e MINUS so teis para construir consultas que se referem a tabelas diferentes. Estes operadores combinam os resultados de dois ou mais SELECTs em um nico resultado.
Unio
O operador UNION retorna todas as linhas distintas das consultas unidas por este operador. No exemplo so listados todos os cargos dos departamentos 10 e 30 sem repetio.
SQL> SELECT JOB 2 FROM EMP 3 WHERE DEPTNO = 10 4 UNION 5 SELECT JOB 6 FROM EMP 7 WHERE DEPTNO = 30 JOB
80
Interseo
O operador INTERSECT retorna apenas as linhas comuns s duas consultas. Para listar os cargos existentes tanto no departamento 10 quanto no departamento 30:
SQL> SELECT JOB 2 FROM EMP 3 WHERE DEPTNO = 10 4 INTERSECT 5 SELECT JOB 6 FROM EMP 7 WHERE DEPTNO = 30 JOB --------CLERK MANAGER
Subtrao
O operador MINUS retorna as linhas presentes na primeira consulta mas no presentes na segunda consulta. Para listar os cargos existentes no departamento 10 mas no existentes no departamento 30:
SQL> SELECT JOB 2 FROM EMP 3 WHERE DEPTNO = 10 4 MINUS 5 SELECT JOB 6 FROM EMP 7 WHERE DEPTNO = 30 JOB --------PRESIDENT
Combinao de operadores
possvel a construo de consultas com operadores UNION, INTERSECT e MINUS combinados. Quando isto feito a execuo efetuada de cima para baixo, porm podem ser utilizados parnteses para alterar esta ordem. 81
A clusula ORDER BY
Como as colunas das tabelas podem ter nomes diferentes quando usamos UNION, INTERSECT e MINUS, o nome da coluna no pode ser usado na clusula ORDER BY quando estes operadores so utilizados. Ao invs do nome deve ser usado o nmero da coluna, como mostrado abaixo:
SQL> SELECT EMPNO, ENAME, SAL 2 FROM EMP 3 UNION 4 SELECT ID, NAME, SALARY 5 FROM EMP HISTORY 6 ORDER BY 2
A clusula ORDER BY deve ser sempre a ltima. A clusula ORDER BY s pode conter os nmeros das colunas, no os nomes.
Mltiplas junes verticais podem ser utilizadas, com parnteses, se necessrio, para alterar a ordem de execuo.
83
Por exemplo:
coluna1, coluna2 tabela coluna1 = (SELECT coluna FROM tabela WHERE condio)
Consultas aninhadas so muito teis quando necessrio selecionar linhas de uma tabela sob uma condio que depende dos dados da prpria tabela.
SELECT ENAME, JOB, SAL FROM EMP WHERE SAL = salrio encontrado na etapa anterior
SQL> SELECT ENAME, JOB, SAL 2 FROM EMP 3 WHERE SAL = (SELECT MIN(SAL) FROM EMP) ENAME JOB SAL ---------- --------- ------SMITH CLERK 800
Antes da consulta interna que retorna apenas um valor, podem ser usados os operadores =, <, >, <=, >=, <>.
SQL> SELECT ENAME, JOB 2 FROM EMP 3 WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'BLAKE') ENAME JOB ---------- --------JONES MANAGER BLAKE MANAGER CLARK MANAGER
O cargo de BLAKE obtido pela consulta interna e utilizado pela consulta principal.
SQL> SELECT ENAME, SAL, DEPTNO 2 FROM EMP 3 WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO) ENAME SAL DEPTNO
85
Note que a consulta interna tem uma clusula GROUP BY, e portanto retorna mais de um valor. Neste caso o operador IN deve ser usado para tratar a lista de valores.
O resultado da consulta interna no indica o departamento, no havendo assim qualquer correspondncia entre o salrio retornado e o departamento do funcionrio.
Para haver correspondncia entre o salrio e o departamento a consulta foi escrita novamente:
SQL> SELECT ENAME, SAL, DEPTNO 2 FROM EMP 3 WHERE (SAL,DEPTNO) IN 4 (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO) ENAME SAL DEPTNO ---------- ------- ------SMITH 800 20 JAMES 950 30 MILLER 1300 10
Nesta nova consulta, retornado um par de colunas que comparado com um par de colunas da consulta principal. Note que as colunas esquerda da condio de procura esto entre parnteses e so separadas por vrgulas.
As colunas listadas na consulta interna devem estar na mesma ordem das colunas esquerda da condio de procura.
As colunas retornadas pela consulta interna devem ser em mesmo nmero e do mesmo tipo de dados das colunas esquerda da condio de procura.
Se uma consulta interna retornar mais de uma linha e a condio de procura utilizar um operador de uma linha apenas gera o erro mostrado abaixo:
86
SQL> SELECT ENAME, SAL, DEPTNO 2 FROM EMP 3 WHERE SAL = 4 (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO) ERROR: ORA-01427: single-row subquery returns more than one row no rows selected
SQL> SELECT ENAME, JOB 2 FROM EMP 3 WHERE JOB = 4 (SELECT JOB FROM EMP WHERE ENAME = 'SMYTHE') ERROR: ORA-01426: sigle-row subquery returns no row no rows selected
ANY compara o valor com cada valor retornado pela consulta interna.
Para mostrar os empregados que recebem mais do que o menor salrio do departamento 30:
SQL> SELECT ENAME, SAL, JOB, DEPTNO 2 FROM EMP 3 WHERE SAL > ANY 4 (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) 5 ORDER BY SAL DESC ENAME SAL JOB DEPTNO ---------- ------- --------- ------KING 5000 PRESIDENT 10 SCOTT 3000 ANALYST 20 FORD 3000 ANALYST 20 JONES 2975 MANAGER 20 BLAKE 2850 MANAGER 30 CLARK 2450 MANAGER 10 ALLEN 1600 SALESMAN 30 TURNER 1500 SALESMAN 30 MILLER 1300 CLERK 10
87
30 30 20
12 rows selected.
Quando usamos ANY geralmente usamos DISTINCT para reduzir a lista de valores a serem comparados.
ALL compara o valor com todos os valores retornados pela consulta interna.
A consulta abaixo encontra os empregados que ganham mais do que todos os empregados do departamento 30.
SQL> SELECT ENAME, SAL, JOB, DEPTNO 2 FROM EMP 3 WHERE SAL > ALL 4 (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) 5 ORDER BY SAL DESC ENAME SAL JOB DEPTNO ---------- ------- --------- ------KING 5000 PRESIDENT 10 SCOTT 3000 ANALYST 20 FORD 3000 ANALYST 20 JONES 2975 MANAGER 20
SQL> SELECT JOB, AVG(SAL) 2 FROM EMP 3 GROUP BY JOB 4 HAVING AVG(SAL) = 5 (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB) JOB AVG(SAL) --------- -------PRESIDENT 5000
executada para cada uma das linhas consideradas candidatas na consulta principal.
Estas propriedades causam a consulta interna ser processada de maneira diferente de uma consulta aninhada comum.
89
Uma consulta interna correlacionada identificada pela presena de uma coluna da consulta principal na consulta interna.
Para encontrar os empregados que recebem mais do que o salrio mdio de seus departamentos:
SQL> SELECT EMPNO, ENAME, SAL, DEPTNO 2 FROM EMP E 3 WHERE SAL > 4 (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) 5 ORDER BY DEPTNO EMPNO ENAME SAL DEPTNO ------- ---------- ------- ------7839 KING 5000 10 7566 JONES 2975 20 7788 SCOTT 3000 20 7902 FORD 3000 20 7499 ALLEN 1600 30 7698 BLAKE 2850 30
Consulta principal
90
A linha selecionada possui a coluna DEPTNO, e a clusula WHERE da consulta interna tambm possui a mesma coluna da mesma tabela EMP, portanto a consulta interna ser realizada.
A clusula WHERE compara o salrio de Smith, 800, com o valor retornado da consulta interna.
Consulta Interna
O operador EXISTS
O operador EXISTS freqentemente usado com consultas aninhadas correlacionadas, testando se o valor existe. Se o valor existir, retorna verdadeiro, caso contrrio retorna falso.
SQL> SELECT EMPNO, ENAME, JOB, DEPTNO 2 FROM EMP E 3 WHERE EXISTS 4 (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO) 5 ORDER BY EMPNO EMPNO ENAME JOB DEPTNO ------- ---------- --------- ------7566 JONES MANAGER 20 7698 BLAKE MANAGER 30 7782 CLARK MANAGER 10
91
20 10 20
SQL> SELECT EMPNO, ENAME, DEPTNO 2 FROM EMP 3 WHERE NOT EXISTS 4 (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO) no rows selected
SQL> SELECT DEPTNO, DNAME 2 FROM DEPT D 3 WHERE NOT EXISTS 4 (SELECT 1 FROM EMP E WHERE E.DEPTNO = D.DEPTNO) DEPTNO DNAME ------- -------------40 OPERATIONS
Note que neste exemplo a consulta interna no precisa retornar nada, porm a clusula SELECT precisa de uma coluna, mesmo que seja um literal.
Exemplos de restries
Tabela SAL no permitindo salrio nulo.
ALTER TABLE EMP MODIFY (SAL NUMBER CONTRAINT NN_SAL NOT NULL)
93
Tabela DEPT com nome do departamento nico definido como restrio de tabela.
CREATE TABLE DEPT ( DEPTNO NUMBER(2) NOT NULL, DNAME CHAR(14), LOC CHAR(13), CONSTRAINT UNQ_DNAME UNIQUE (DNAME) USING INDEX PCTFREE 20 TABLESDPACE TBLSP_DEPT STORAGE (INITIAL 8K NEXT 6K))
DNAME
LOC
CONSTRAINT CHECK_DEPTNO CHECK (DEPTNO BETWEEN 10 AND 99) DISABLE, CHAR(14) CONSTRAINT CHECK_DNAME CHECK(DNAME=UPPER(DNAME)) DISABLE, CHAR(13) CONSTRAINT CHECK_LOC CHECK (LOC IN ('DALLAS','BOSTON',...)) DISABLE)
94
AS SELECT...
Exemplo:
95
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ------- ---------- --------- ------- --------- ------- ------- ------7369 SMITH CLERK 7902 13-JUN-83 800 20 7499 ALLEN SALESMAN 7698 15-AUG-83 1600 300 30 7521 WARD SALESMAN 7698 26-MAR-84 1250 500 30 7566 JONES MANAGER 7839 31-OCT-83 2975 20 7654 MARTIN SALESMAN 7698 05-DEC-83 1250 1400 30 7698 BLAKE MANAGER 7839 11-JUN-84 2850 30 7782 CLARK MANAGER 7839 14-MAY-84 2450 10 7788 SCOTT ANALYST 7566 05-MAR-84 3000 20 7839 KING PRESIDENT 09-JUL-84 5000 10 7844 TURNER SALESMAN 7698 04-JUN-84 1500 0 30 7876 ADAMS CLERK 7788 04-JUN-84 1100 20 7900 JAMES CLERK 7698 23-JUL-84 950 30 7902 FORD ANALYST 7566 05-DEC-83 3000 20 7934 MILLER CLERK 7782 21-NOV-83 1300 10 14 rows selected.
Como pode ser visto, as duas tabelas tem exatamente a mesma estrutura e o mesmo contedo.
SQL> CREATE TABLE SALARIOS_DOS_EMPREGADOS 2 (NOME, SALARIO, FAIXA) 3 AS 4 SELECT ENAME, SAL, GRADE 5 FROM EMP, SALGRADE 6 WHERE SAL BETWEEN LOSAL AND HISAL Table created. SQL> DESCRIBE SALARIOS_DOS_EMPREGADOS Name Null? Type ------------------------------- -------- ---NOME CHAR(10) SALARIO NUMBER(7,2) FAIXA NUMBER SQL> SELECT * 2 FROM SALARIOS_DOS_EMPREGADOS NOME SALARIO FAIXA ---------- ------- ------SMITH 800 1 ADAMS 1100 1 JAMES 950 1 WARD 1250 2 MARTIN 1250 2 MILLER 1300 2 ALLEN 1600 3 TURNER 1500 3 JONES 2975 4 BLAKE 2850 4
96
4 4 4 5
14 rows selected.
Para alterar a tabela empregados e garantir todos tenham salrio inferior a 5000:
97
SQL> ALTER TABLE EMPREGADOS 2 MODIFY (NOME_DA_ESPOSA CHAR(25)) Table altered. SQL> DESCRIBE EMPREGADOS Name Null? Type ------------------------------- -------- ---EMPNO NOT NULL NUMBER(4) ENAME CHAR(10) JOB CHAR(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2) NOME_DA_ESPOSA CHAR(25)
98
Comment created.
SQL> COMMENT ON COLUMN FUNCIONARIOS.NOME_DA_ESPOSA IS > 'NOME DA ESPOSA DO FUNCIONARIO' Comment created.
Removendo tabelas
As tabelas podem ser removidas do banco de dados atravs do comando:
SQL> DROP TABLE SALARIOS_DOS_EMPREGADOS Table dropped. SQL> DROP TABLE FUNCIONARIOS Table dropped.
INSERT INTO nome_da_tabela [(coluna, coluna, ...)] VALUES (valor, valor, ...)
Os exemplos sero efetuados sobre a tabela Department criada a partir da tabela Dept.
99
Table created.
Quando os novos valores so inseridos em todas as colunas da tabela, na mesma ordem das colunas da tabela, a lista de colunas pode ser omitida. recomendado que a lista de colunas seja sempre especificada, para no haver necessidade de alterar o programa quando uma nova coluna for adicionada tabela.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC ) 2 VALUES (50, 'MARKETING', 'SAN JOSE' ) 1 row created.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, LOC ) 2 VALUES ( 60, 'ALBERTA' ) 1 row created.
Em vez que omitir o nome do departamento na lista de colunas, pode ser especificado o valor nulo para o nome do departamento, o resultado o mesmo.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC ) 2 VALUES ( 70, NULL, 'DETROIT' )
1 row created.
SQL> INSERT INTO DEPARTMENT ( DEPTNO, DNAME, LOC ) 2 VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' ) Enter value for dept_num: 80 Enter value for dept_name: RESEARCH Enter value for dept_loc: ATLANTA old 2: VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' ) new 2: VALUES ( 80, 'RESEARCH', 'ATLANTA' ) 1 row created.
100
SQL> INSERT INTO DEPARTMENT 2 VALUES ( 90, 'INSURANCE', 'LONDON' ) 1 row created.
SQL> SELECT * 2 FROM DEPARTMENT 3 ORDER BY DEPTNO DEPTNO DNAME LOC ------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 MARKETING SAN JOSE 60 ALBERTA 70 DETROIT 80 RESEARCH ATLANTA 90 INSURANCE LONDON 9 rows selected.
Para os exemplos de insero de valores de data e hora ser criada a tabela Employee a partir da tabela Emp.
Quando uma data inserida, o formato DD-MON-YY geralmente usado. Com este formato, o sculo padro o sculo 20 (19xx). O campo data tambm contm informao de hora, que quando no especificada assume o valor padro de zero horas (00:00:00).
Se for necessrio especificar a data em outro sculo, ou for necessrio especificar a hora, a funo TO_DATE utilizada.
SQL> INSERT INTO EMPLOYEE 2 ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) 3 VALUES ( 4 7658, 5 'CODD',
101
6 'ANALYST', 7 7566, 8 TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'), 9 3000, 10 NULL, 11 20) 1 row created.
Para exemplo de insero de valores a partir de uma outra tabela ser criada a tabela SALARY_GRADE a partir da tabela SALGRADE.
SQL> CREATE TABLE SALARY_GRADE 2 AS 3 SELECT * FROM SALGRADE 4 WHERE GRADE=0 Table created.
Como no existe nenhum departamento com nmero zero na tabela SALGRADE, no foi includa nenhuma linha na tabela SALARY_GRADE durante a criao.
Para inserir na tabela SALARY_GRADE, a partir da tabela SALGRADE, os valores correspondentes faixa 1.
SQL> INSERT INTO SALARY_GRADE 2 SELECT * 3 FROM SALGRADE 4 WHERE GRADE = 1 1 row created.
SQL> SELECT * 2 FROM SALARY_GRADE GRADE LOSAL HISAL ------- ------- ------1 700 1200
102
SQL> UPDATE EMPLOYEE 2 SET 3 JOB = 'SALESMAN', 4 HIREDATE = SYSDATE, 5 SAL = SAL*1.1 6 WHERE ENAME = 'SCOTT' 1 row updated.
SQL> UPDATE EMPLOYEE 2 SET JOB = 'VENDEDOR' 3 WHERE JOB = 'SALESMAN' 5 rows updated.
SQL> SELECT ENAME, JOB 2 FROM EMPLOYEE 3 ORDER BY JOB, ENAME ENAME JOB ---------- --------CODD ANALYST FORD ANALYST ADAMS CLERK JAMES CLERK MILLER CLERK SMITH CLERK BLAKE MANAGER CLARK MANAGER JONES MANAGER KING PRESIDENT
103
ALLEN VENDEDOR MARTIN VENDEDOR SCOTT VENDEDOR TURNER VENDEDOR WARD VENDEDOR 15 rows selected.
Apesar de no possuir nenhuma linha, a tabela Employee ainda existe, para elimin-la utilizado o comando da linguagem de definio de dados (DDL) DROP TABLE.
104
Viso
O que uma viso
*0 Uma viso como uma janela atravs da qual os dados das tabelas podem ser vistos e alterados. *1 Uma viso derivada de uma tabela ou de outra viso, a qual chamada de tabela ou viso base. - uma tabela real com os dados fisicamente armazenados. *2 Uma viso armazenada na forma de um comando SELECT apenas. uma tabela virtual, ou seja, uma tabela que no existe fisicamente no banco de dados, mas parece existir. *3 Uma viso no tem dados prprios. Os dados so manipulados a partir das tabelas base. Vises so teis pelas seguintes razes:
*4 Restringir o acesso ao banco de dados. Permite enxergar apenas parte das tabelas. *5 Permite aos usurios executar consultas simples para obter resultados de consultas complexas. Podem ser recuperados dados de vrias tabelas como se fosse uma nica tabela. *6 Prov independncia de dados, permitindo alterar as tabelas base sem afetar as aplicaes dos usurios.
Vises simples
*7 dados derivados de uma nica tabela *8 no contm funes ou dados grupados.
Vises complexas
*9 dados derivados de mltiplas tabelas 105
*10
CREATE VIEW nome_da_view [(coluna1, coluna2,...)] AS SELECT clusula_select [WITH CHECK OPTION [CONSTRAINT nome_da_restrio]]
Para criar uma viso simples chamada D10EMP, a partir da tabela EMP, contendo certos detalhes dos funcionrios do departamento 10:
SQL> CREATE VIEW D10EMP 2 AS 3 SELECT EMPNO, ENAME, DEPTNO 4 FROM EMP 5 WHERE DEPTNO = 10 6 WITH CHECK OPTION View created.
SQL> SELECT * 2 FROM D10EMP EMPNO ENAME DEPTNO ------- ---------- ------7782 CLARK 10 7839 KING 10 7934 MILLER 10
Para criar uma viso complexa, chamada DEPT_SUMMARY, contendo funes de grupo e dados de mais de uma tabela: 106
CREATE VIEW DEPT_SUMMARY ( NAME, MINSAL, MAXSAL, AVGSAL ) AS SELECT DNAME, MIN(SAL), MAX(SAL), AVG(SAL) FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO GROUP BY DNAME
Note que nomes alternativos para as colunas foram especificados na viso, o que necessrio quando os itens da clusula Select no esto de acordo com as regras para nomes de colunas, ou se alguma coluna derivada de uma funo ou expresso.
Quando um alis utilizado para o nome da coluna na clusula Select, no necessrio colocar um nome para a coluna na clusula Create View.
CREATE VIEW DEPT20 AS SELECT ENAME, SAL*12 ANNSAL FROM EMP WHERE DEPTNO = 20
A clusula WITH CHECK OPTION especifica que inseres e atualizaes realizadas atravs da viso no podem gerar linhas que a viso no pode enxergar. Se na viso D10EMP tentarmos inserir um funcionrio do departamento 20 um erro gerado.
SQL> INSERT INTO D10EMP ( EMPNO, ENAME, DEPTNO ) 2 VALUES ( 9999, 'MICHAEL', 20 ) INSERT INTO D10EMP ( EMPNO, ENAME, DEPTNO ) * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation
107
A viso EMP_DATA s permite inseres ou atualizaes se o salrio estiver na faixa 1000 a 2000, o gerente estiver cadastrado na tabela de empregados, e o departamento estiver cadastrado na tabela de departamentos.
SQL> CREATE VIEW EMP_DATA 2 AS 3 SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO 4 FROM EMP 5 WHERE SAL BETWEEN 1000 AND 2000 6 AND MGR IN ( SELECT DISTINCT EMPNO FROM EMP ) 7 AND DEPTNO IN ( SELECT DEPTNO FROM DEPT ) 8 WITH CHECK OPTION View created.
A viso EMP_DETAILS restringe o acesso aos dados do prprio usurio, no perodo das 7 s 17 horas, de segunda a sexta-feira.
SQL> CREATE VIEW EMP_DETAILS 2 AS 3 SELECT EMPNO, ENAME, JOB, DEPTNO 4 FROM EMP 5 WHERE ENAME = USER 6 AND TO_CHAR(SYSDATE,'HH24') BETWEEN 7 AND 17 7 AND TO_CHAR(SYSDATE,'D') BETWEEN 2 AND 6 8 WITH CHECK OPTION View created.
SQL> CREATE VIEW EMPLOYEES ( ID_NUMBER, NAME, POSITION, DEPARTMENT ) 2 AS 3 SELECT EMPNO, ENAME, JOB, DEPTNO 4 FROM EMP 5 WHERE DEPTNO IN ( SELECT DISTINCT DEPTNO FROM DEPT ) 6 WITH CHECK OPTION CONSTRAINT DEPT_CHECK View created.
Quando a viso criada, o comando SELECT no executado, o comando SELECT simplesmente armazenado no dicionrio de dados.
*11 *12
*13 Converter a consulta da viso em uma operao equivalente sobre a(s) tabela(s) base. Atravs da viso USER_VIEWS do dicionrio de dados, a definio da viso pode ser recuperada. Alguns parmetros SET influenciam no texto mostrado:
SQL> DESCRIBE USER_VIEWS Name Null? Type ------------------------------- -------- ---VIEW_NAME NOT NULL CHAR(30) TEXT_LENGTH NUMBER TEXT LONG SQL> COLUMN VIEW_NAME FORMAT A15 SQL> COLUMN TEXT FORMAT A50 SQL> SELECT * 2 FROM USER_VIEWS VIEW_NAME TEXT_LENGTH TEXT --------------- ----------- ------------------------------------------D10EMP 73 SELECT EMPNO, ENAME, DEPTNO FROM EMP WHERE DEPTNO = 10 WITH CHECK OPTION EMPLOYEES 113 SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE DEPTNO IN ( SELECT DISTINCT DEPT 190 SELECT EMPNO, ENAME, JOB, MGR, SAL, DEPTNO FROM EMP WHERE SAL BETWEEN 1000 AND 2 165 SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP WHERE ENAME = USER AND TO_CHAR(SYSDATE 291 SELECT REPID,ORD.CUSTID,CUSTOMER.NAME CUSTNAME
EMP_DATA
EMP_DETAILS
SALES
109
Juno. Funes de grupo. Clusula GROUP BY. Clusula DISTINCT. Coluna ROWNUM. Sub-consulta correlacionada.
*23 *24
*25 *26
Alguma das condies acima. Coluna NOT NULL da tabela que no consta da viso.
Eliminao de vises
As vises so eliminadas atravs do comando DROP VIEW nome_da_viso. 110
SQL> DROP VIEW D10EMP View dropped. SQL> DROP VIEW EMPLOYEES View dropped. SQL> DROP VIEW EMP_DATA View dropped. SQL> DROP VIEW EMP_DETAILS View dropped.
111
A utilizao de ndices altamente recomendada para obter melhor desempenho, e geralmente um dos primeiros ndices a serem criados na tabela o da chave primria.
Os ndices so criados, normalmente, pelos donos das tabelas, mas qualquer usurio que tenha privilgio de ndice sobre a tabela tambm pode criar ndices para a tabela.
Uma vez criado, o ndice ser utilizado pelo Oracle, sempre que for possvel, para acelerar o acesso aos dados. Note que os ndices so utilizados automaticamente, sem requerer qualquer ao por parte do usurio, que nem precisa saber da existncia dos ndices.
Tipos de ndices
UNIQUE
NON UNIQUE
SINGLE COLUMN
CONCATENATED
113
SELECT FROM
b) O ndice no utilizado se a coluna referenciada na clusula Where parte de uma funo ou de uma expresso.
No exemplo abaixo o ndice no utilizado porque a coluna ENAME parte de uma funo:
ndices e Junes
Se no existirem ndices nas colunas utilizadas para realizar a juno equivalente, o Oracle obrigado a realizar uma operao de SORT/MERGE para responder a consulta. Isto significa que cada tabela ordenada separadamente, e depois as duas so unidas de acordo com a condio de juno.
115
No devem ser utilizados mais de 3 ndices por tabela para no prejudicar as operaes realizadas atravs das operaes de DML.
116
O gerador de seqncias
O gerador de seqncias do Oracle utilizado para gerar automaticamente seqncias de nmeros para as linhas das tabelas.
Para gerar os nmeros seqenciais automaticamente, primeiro a seqncia deve ser definida utilizando a declarao CREATE SEQUENCE, conforme a sintaxe mostrada abaixo:
CREATE SEQUENCE [esquema.]nome-da-seqncia [INCREMENTED BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE]
identificao do dono da seqncia. nome vlido para a seqncia. incremento positivo ou negativo. Padro: 1. primeiro nmero a ser gerado. Padro: 1.
MINVALUE|NOMINVALUE menor valor a ser gerado. Padro: 1 para seqncias ascendentes, 10**27-1 para seqncias descendentes. MAXVALUE|NOMAXVALUE seqncias ascendentes. maior valor a ser gerado. Padro: 1 para descendentes, 10**27-1 para seqncias
Para um usurio poder criar uma seqncia deve possuir o privilgio de resource. O comando mostrada abaixo cria uma seqncia para a coluna DEPTNO da tabela DEPT.
117
DEPT_SEQ.NEXTVAL SYS.DUAL
DEPT_SEQ.NEXTVAL SYS.DUAL
Notas:
Se a coluna NEXTVAL for referenciada diversas vezes dentro do mesmo comando SQL, todas as referncias retornam o mesmo valor.
118
A coluna NEXTVAL mais til em comandos de DML. Por exemplo, quando so inseridas linhas na tabela, a seqncia pode ser utilizada para gerar valores nicos para a chave primria.
Quando o nmero seqencial gerado, a seqncia incrementada independentemente de haver um Commit ou um Rollback para a transao. Quando dois usurios acessam a mesma seqncia ao mesmo tempo, os dois usurios podem ver descontinuidades na seqncia, devido a valores gerados para o outro usurio que ainda no receberam o Commit. Os nmeros produzidos pelo gerador de seqncias podem ser saltados devido a Rollbacks.
Em vises.
Com as clusulas Order By, Group By, Connect By, ou Having da declarao SELECT.
Seqncias so tratadas de maneira similar s tabelas, podendo ser alteradas e eliminadas. O dono de uma seqncia pode conceder privilgios a outros usurios.
Notas: 120
Somente os nmeros a serem gerados no futuro so alterados pelo comando Alter Sequence. Os nmeros que j foram gerados no so alterados.
Validaes so realizadas. No pode ser especificado, por exemplo, um novo valor mximo menor que o valor corrente.
O parmetro START WITH no pode ser alterado pelo comando Alter Sequence.
A seqncia deve ser eliminada e recriada para ser iniciada com um novo nmero.
Listando seqncias
As vises USER_SEQUENCES ou ALL_SEQUENCES podem ser utilizadas para descobrir as seqncias existentes.
121
Existem duas classes de transaes. Transaes produzidas pela linguagem de manipulao de dados (DML), que consistem em um ou mais comandos de DML, as quais o Oracle trata como uma nica entidade ou unidade lgica de trabalho (LUW). Transaes causadas pela linguagem de definio de dados (DDL) contm apenas um comando.
As transaes no podem ficar pela metade no banco de dados, ou todas as transaes de uma unidade lgica de trabalho so efetivadas, ou nenhuma efetivada no banco de dados. No pode haver o caso em que umas so efetivadas e outras no.
Uma transao comea com o primeiro comando de DML ou DDL executado, e termina com um dos seguintes comandos.
COMMIT ou ROLLBACK
comando de DDL
Erros
Falha de mquina
122
Aps o fim de uma transao, a prxima declarao SQL inicia uma nova transao automaticamente.
Efetivando as mudanas
Para tornar as mudanas no banco de dados permanentes, elas devem ser efetivadas. O comando COMMIT utilizado para efetivar as mudanas, e o comando ROLLBACK utilizado para descartar as mudanas.
At que o comando Commit seja executado, as mudanas so vistas apenas pelo usurio que as efetuou, os demais usurios enxergam a situao anterior as modificaes.
Removendo mudanas
Mudanas no efetivadas podem ser descartadas atravs do comando ROLLBACK.
O comando ROLLBACK retorna os dados ao estado em que se encontrava aps o ltimo COMMIT.
Falhas do sistema
Quando uma transao interrompida por um erro, como, por exemplo, uma falha do sistema, toda a transao descartada (Rolled back). Este procedimento previne que os erros causem mudanas no desejadas aos dados.
O Rollback automtico mais freqentemente causado por falhas no sistema, tais como falta de luz ou queda do sistema operacional. Erros causados pela entrada de comandos, tais como digitar o nome errado para uma coluna ou tentar realizar uma operao no permitida na tabela de outro usurio, no interrompem uma transao, nem causam um Rollback automtico, porque estes erros so 123
detectados na fase de 'parse' do comando (quando o comando lido e verificado), e no durante a fase de execuo.
Controlando transaes
Os seguintes comandos SQL so utilizados para controlar uma transao:
COMMIT [WORK]
SAVEPOINT nome_do_savepoint
ROLLBACK [WORK]
ROLLBACK TO nome_do_savepoint
COMMIT [WORK]
Termina a transao
Deve ser executada explicitamente e no implicitamente, caso contrrio em caso de trmino anormal do programa a ltima transao desfeita (Rollback).
Comandos de DDL sempre geram um Commit quando so executados. Quando um comando de DDL executado aps a execuo de vrios comandos de DML, o Commit executado antes do comando de DDL ser executado. Aps o comando DDL ser executado, se a execuo no causar erro, esta tambm efetivada.
SAVEPOINT savepoint_name
Permite guardar o trabalho at um determinado ponto, para que mais tarde seja possvel desfaz-lo totalmente, ou apenas at este determinado ponto.
Quando um novo SavePoint criado com o mesmo nome de um anterior, o anterior eliminado.
O nmero mximo de SavePoints por processo de usurio 5, por padro. Este padro pode ser mudado. 125
Fim da transao
Desfaz as alteraes
Se a transao for de DDL, o Commit executado antes da transao no permite o Rollback das transaes anteriores. 126
Oracle realiza um Rollback a nvel de declarao atravs da criao de um SavePoint implcito antes de cada transao de DML. Este SavePoint no acessvel diretamente pelo usurio.
mantm o SavePoint at onde foi feito o Rollback, mas perde os SavePoints criados aps o SavePoint para o qual o Rollback foi feito.
Rollbacks implcitos
Rollbacks implcitos ocorrem em caso de trmino anormal
Autocommit
Commit pode ser executado automaticamente atravs do comando SET AUTOCOMMIT ON. Neste caso, aps cada comando INSERT, UPDATE ou DELETE executado um comando COMMIT automaticamente.
Com SET AUTOCOMMIT OFF, o prprio usurio tem que executar o comando COMMIT manualmente.
127
SQL> INSERT INTO DEPARTMENT VALUES ( 50, 'TESTING', 'LAS VEGAS') 1 row created.
SQL> SELECT * FROM DEPARTMENT DEPTNO DNAME LOC ------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 TESTING LAS VEGAS
Para, por erro, trocar o nome de todos os departamentos por MARKETING. 128
SQL> SELECT * FROM DEPARTMENT DEPTNO DNAME LOC ------- -------------- ------------10 MARKETING NEW YORK 20 MARKETING DALLAS 30 MARKETING CHICAGO 40 MARKETING BOSTON 50 MARKETING LAS VEGAS
Para desfazer o erro da ltima declarao, mas sem desfazer a incluso do departamento 50.
SQL> SELECT * FROM DEPARTMENT DEPTNO DNAME LOC ------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 TESTING LAS VEGAS
SQL> UPDATE DEPARTMENT 2 SET DNAME = 'MARKETING' 3 WHERE DNAME = 'SALES' 1 row updated.
129
SQL> SELECT * FROM DEPARTMENT DEPTNO DNAME LOC ------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 MARKETING CHICAGO 40 OPERATIONS BOSTON 50 TESTING LAS VEGAS
SQL> SELECT * FROM DEPARTMENT DEPTNO DNAME LOC ------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 MARKETING CHICAGO 40 OPERATIONS BOSTON 50 TESTING LAS VEGAS
Consistncia de leitura
Usurios de banco de dados realizam dois tipos de acesso ao banco de dados:
necessrio se garantir uma consistncia de leitura tanto para os usurios que esto gravando quanto para os usurios que esto lendo do banco de dados. Os usurios que esto lendo no devem enxergar os dados que esto em processo de alterao. Os usurios que esto gravando devem enxergar os dados da forma 131
como foram alterados, mesmo que as mudanas no tenham ainda sido efetivadas.
A finalidade da consistncia de leitura garantir que cada usurio veja os dados da forma como existiam antes do ltimo Commit.
A consistncia de leitura implementada mantendo-se uma cpia parcial do banco de dados nos segmentos de Rollback.
Quando uma insero, uma atualizao ou uma eliminao feita no banco de dados, o Oracle faz uma cpia dos dados antes das mudanas, e guarda esta cpia no Segmento de Rollback.
Todos os usurios que efetuam leituras, exceto aquele que causou as mudanas, enxergam o banco de dados como ele existia antes das mudanas, atravs da cpia mantida nos Segmentos de Rollback.
Antes das mudanas serem efetivadas, somente o usurio que modificou os dados enxerga o banco de dados com as modificaes incorporadas.
Aps a efetivao das mudanas, todos os usurios passam a enxergar os dados com as mudanas efetuadas, e os Segmentos de Rollback so liberados.
Quando ocorre um Rollback, os dados gravados nos Segmentos de Rollback so escritos de volta nas tabelas.
A declarao SQL SET TRANSACTION READ ONLY utilizada para iniciar uma transao de leitura apenas. 132
A consistncia de leitura que READ ONLY prov implementada da mesma maneira que a consistncia nvel de declarao - usando segmentos de rollback. Cada declarao por padro enxerga uma viso consistente dos dados na hora em que a declarao foi feita. Esta funcionalidade muito til para relatrios que processam mltiplas consultas enquanto os usurios atualizam as mesmas tabelas.
Notas:
*0 A declarao SET TRANSACTION READ ONLY deve ser a primeira da transao. *1 Somente consultas so permitidas na transao. *2 COMMIT, ROLLBACK ou uma declarao DDL terminam a transao. Com DDL nenhuma indicao dada que a transao terminou. *3 Durante a transao, todas as consultas se referem ao mesmo instantneo (snapshot) do banco de dados (mudanas efetivadas antes da transao comear). *4 Outros usurios podem continuar a atualizar os dados.
Exemplo:
SQL> SET TRANSACTION READ ONLY Transaction set. SQL> SELECT * FROM DEPT DEPTNO DNAME LOC ------- -------------- ------------10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SQL> COMMIT Commit complete.
133
134