apostila 1 banco de dados

Upload: ricardo-goncalves

Post on 06-Jul-2015

1.128 views

Category:

Documents


0 download

TRANSCRIPT

MANUAL DE TREINAMENTOVerso: 01 Pg. 1/134 Vigncia: SQL Bsico para Oracle Data: 05/07/2011

SQL Bsico para Oracle

Compilao

Leandro Mendes Ferreira

ContedoContedo.................................................................................................................. 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

Banco de dados relacionalO modelo predominante atualmente o relacional. Um banco de dados relacional pode ser definido como um banco de dados que aparece ao usurio como uma coleo de tabelas relacionadas entre si.

Os trs elementos de um banco de dados relacional so:

tabelas colunas linhas

Modelagem de DadosEntidadePode 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

Relacionamento9

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 relacionamentoExistem trs tipos de relacionamento entre entidades:

um-para-um um-para-muitos muitos-para-muitos

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:

CardinalidadeA 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 atributoObserve 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 PrimriaEm 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 EstrangeiraUma 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

Unio Interseo Diferena Produto

Juno

15

Seleo/Restrio

Projeo

Unio

16

Interseo

Diferena

17

18

Sistema de Gerenciamento de Banco de DadosO Sistema de Gerenciamento de Banco de Dados (SGBD) um software que controla o armazenamento, as modificaes, e os acessos s informaes do banco de dados.

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

O Utilitrio PL/SQL DeveloperPL/SQL Developer um ambiente de desenvolvimento integrado (IDE) que foi especialmente destinado ao desenvolvimento de programas armazenados em bancos de dados Oracle. Ao longo do tempo, temos observado que mais e mais lgicas de Negcios e Aplicaes vem sendo migradas / desenvolvidas em servidores Oracle, tornando assim a programao em PL/SQL uma parte significante de todo o processo de desenvolvimento. PL/SQL Developer tem como principal objetivo facilidade de uso, qualidade de cdigo e produtividade, ou seja, um conjunto de conceitos que hoje so as chaves para o sucesso de qualquer projeto de desenvolvimento de aplicaes Oracle.

Query BuilderA 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 SQLA 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

Tipos de declaraes SQLOs comandos ou declaraes em SQL so divididos nas seguintes categorias:

DDL (Data Definition Language) a parte do SQL usada para definir dados e objetos de um banco de dados. Atravs destes comandos so feitas inseres no dicionrio de dados.

A tabela abaixo indica comandos DDL :

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

DML (Data Manipulation Language) a parte da SQL usada para a recuperao ou manipulao de dados. Permite realizar consultas, adicionar, alterar e excluir informaes do banco de dados. Possui tambm clusulas adicionais e funes para clculo de totais, mdias, contagem de registros e mximo e mnimo entre valores.

22

A tabela abaixo apresenta alguns dos mais importantes comandos dessa categoria:

Coman do Select Insert Delete Update Commit Rollback

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

Recomendaes sobre os nomes das tabelas

Usar nomes descritivos para as tabelas, colunas, ndices e outros objetos.

Abreviar de forma consistente, mantendo sempre a mesma abreviatura.

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_.

Use o mesmo nome para descrever o mesmo atributo em tabelas diferentes.

23

Tipo de dado das colunasTipo CHAR(n) Contedo Caracteres alfanumricos com at 'n' caracteres. Coluna de tamanho constante independente do que est armazenado. Mximo de 255 caracteres. Caracteres alfanumricos com at 'n' caracteres. No Oracle 6 sinnimo de CHAR, e pode ter no mximo 255 caracteres. Caracteres alfanumricos com at 'n caracteres. Introduzida no Oracle 7, o tamanho armazenado varia de acordo com o contedo da coluna, e pode ter at 2000 caracteres. Caracteres alfanumricos com at 2 GigaBytes (2**31 1). S pode haver uma coluna LONG por tabela. No pode ser indexada. No podem ser especificadas restries de integridade, exceto NOT NULL. Dados binrios, como som e imagem, at 255 bytes. No podem ser executadas funes de manipulao de caracteres sobre colunas RAW. Tem as mesmas restries de LONG. No existe converso de caracteres, como, por exemplo, ANSI x PC850. Semelhante a RAW, porm podendo armazenar at 2 GigaBytes. Caracteres hexadecimais representando o endereo nico de uma linha em uma tabela. Formato binrio to rtulo do sistema operacional. Usado com o Trusted ORACLE. Nmero com a preciso 'p' e a escala 's'. A preciso 'p' pode variar de 1 a 38. A escala 's' pode variar de -84 a +127 Data vlida, desde 1 de janeiro de 4712 AC, at 31 de dezembro de 4712 DC. Para cada coluna DATA so armazenados o Sculo, o Ano, o Ms, o Dia, a Hora, o Minuto e o Segundo.(Padro Americano) Nmero de ponto flutuante com preciso decimal de 38 dgitos, ou preciso binria de 126 dgitos.

VARCHAR(n)

VARCHAR2(n)

LONG

RAW(n)

LONG RAW ROWID MLSLABEL NUMBER(p,s)

DATE

FLOAT

24

Restries (constrains)So recursos proporcionados pelo SGBD para implementar regras de consistncia bsicas para os dados de uma tabela.

Restrio CONSTRAINT nome_da_restri o NULL NOT NULL UNIQUE

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

FOREIGN KEY (coluna...) REFERENCES tabela(col(s)) CHECK condio

DISABLE (ENABLE) EXCEPTIONS INTO

25

Construo bsica de uma consultaO comando SELECT recupera informaes do banco de dados, implementando todos os operadores da lgebra relacional.

Em sua forma mais simples deve incluir:

a. A clusula SELECT, que lista as colunas a serem envolvidas (essencialmente a Projeo, conforme definido na lgebra relacional).

b. A clusula FROM, que especifica as tabelas envolvidas.

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:

SQL> SELECT * 2 FROM EMP

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 aritmticasUma 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.

SQL> SELECT ENAME, SAL*12, COMM 2 FROM EMP

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

JAMES FORD MILLER

11400 36000 15600

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.

No exemplo abaixo, a multiplicao (250*12) realizada primeiro, e depois somada ao salrio.

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

Nomes alternativos para ttulos de colunasPara mostrar o resultado de uma consulta, o SQL*PLUS normalmente utiliza o nome da coluna como ttulo da coluna. Em muitos casos, isto torna o ttulo sem significado. Pode ser alterado o ttulo da coluna usando-se um Alis.

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 concatenaoO 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:

SQL> SELECT EMPNO||ENAME EMPREGADO 2 FROM EMP

EMPREGADO -------------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER 14 rows selected.

LiteraisUm 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.

Manuseio de valores nulosSe em uma linha no existir valor para uma determinada coluna, este valor dito como sendo nulo. Um valor nulo um valor que no est disponvel, desconhecido, ou no aplicvel. Um valor nulo no o mesmo que zero. Zero um nmero.

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

ADAMS JAMES FORD MILLER 14 rows selected.

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 funo NVL espera dois argumentos:

a)

uma expresso

b)

um valor no nulo

Podem ser convertidos valores nulos de data, nmeros, ou caracteres:

NVL(ColunaData, 01-jan-84')

NVL(ColunaNumero, 9)

32

NVL(ColunaCaracter, alfanumrico')

Eliminao de linhas duplicadasA no ser que seja especificado o contrrio, as linhas duplicadas no so eliminadas dos resultados das consultas.

SQL> SELECT DEPTNO 2 FROM EMP DEPTNO ------20 30 30 20 30 30 10 20 10 30 20 30 20 10

Para eliminar as linhas duplicadas, deve ser includa a palavra DISTINCT aps o SELECT.

SQL> SELECT DISTINCT DEPTNO 2 FROM EMP DEPTNO ------10 20 30

Mltiplas colunas podem ser especificadas aps a palavra DISTINCT.

SQL> SELECT DISTINCT DEPTNO, JOB 2 FROM EMP DEPTNO JOB ------- --------10 CLERK

33

Acima esto mostradas todas as combinaes diferentes de departamentos e cargos.

10 10 20 20 20 30 30 30

MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN

Ordenao das linhasNormalmente, a ordem das linhas retornadas por uma consulta indefinida. A clusula ORDER BY pode ser usada para ordenar linhas. Se for usada, ORDER BY deve ser sempre a ltima clusula de um comando SELECT.

Para ordenar pelo nome do empregado, usamos:

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.

Ordem padro de ordenao:

- 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

Exerccio: verificar como ficam os valores nulos aps a ordenao.

Critrios de pesquisaOs 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:

- Um nome de coluna - Um operador de comparao - Um nome de coluna, constante, ou lista de valores

Existem dois tipos de operadores: lgicos e SQL.

Os operadores lgicos testam as seguintes condies:

= > >= < 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

Para sabermos que funcionrios tem comisso superior ao salrio, usamos:

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

O operador BETWEEN testa valores no intervalo ou idnticos aos limites.

SQL> SELECT ENAME, SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 ENAME SAL ---------- -------

37

ALLEN WARD MARTIN TURNER ADAMS MILLER

1600 1250 1250 1500 1100 1300

O operador IN testa os valores especificados em uma lista.

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

Se caracteres ou datas forem utilizados, devem ser envoltos por apstrofos.

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

(quatro caracteres de sublinhado)

38

---------WARD KING FORD

O operador IS NULL serve especificamente para testar valores nulos.

Para listar os funcionrios que no possuem gerente, usamos:

SQL> SELECT ENAME, MGR 2 FROM EMP 3 WHERE MGR IS NULL ENAME MGR ---------- ------KING

Os operadores mostrados abaixo podem ser utilizados para testes de negao:

!=

^=

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

BLAKE CLARK SCOTT KING JAMES FORD

2850 2450 3000 5000 950 3000

8 rows selected.

Para listar os empregados cujos cargos no comeam com a letra M, usamos:

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

Para listar os empregados com gerentes, usamos:

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

e

x = NULL

40

sempre falso. Nulo nunca igual a nada nem diferente de nada, nem a outro nulo.

Consultas com condies mltiplasOs operadores AND e OR podem ser utilizados para criar expresses lgicas compostas.

O predicado AND espera que todas duas condies sejam verdadeiras.

O predicado OR espera que uma (ou as duas) condies sejam verdadeiras.

Nos exemplos abaixo as condies so as mesmas, porm os predicados so diferentes.

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

7654 7844 7876 7900 7934

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

Os parnteses especificam a ordem em que os operadores devem ser calculados.

Precedncia dos operadoresa) os operadores de comparao e os operadores SQL tem precedncias iguais. 42

=, !=, , =, BETWEEN...AND..., IN, LIKE, IS NULL

b) NOT (para reverter o resultado lgico da expresso, WHERE NOT(sal>2000))

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.

Resumo do comando SELECTSELECT FROM WHERE ORDER BY [DISTINCT] {* | coluna [alis],....} tabela condies {coluna | expresso} [ASC|DESC]

43

Funes que manipulam caracteresLOWER(coluna | literal)Transforma letras maisculas em minsculas.

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

LPAD(coluna | literal, tamanho, 'caracter')Preenche a sequncia de caracteres, esquerda, com o caracter e o tamanho informados. Se o caracter de preenchimento no for informado, ser utilizado o caracter de espao.

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

RPAD(coluna | literal, tamanho, 'caracter')Preenche a seqncia de caracteres, direta, com o caracter e o tamanho informados. Se o caracter de preenchimento no for informado, ser utilizado o caracter de espao.

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..................

SUBSTR(coluna | literal, posio, comprimento)Retorna uma seqncia de caracteres, a partir da posio indicada, com o comprimento especificado.

SQL> SELECT SUBSTR('ORACLE',2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5) 2 FROM DEPT

45

SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5) -------------------- --------------- -------------------RACL CCOUNTING COUNT RACL ESEARCH SEARC RACL ALES LES RACL PERATIONS ERATI

INSTR(coluna | literal, seqncia de caracteres', posio, n)Encontra a posio da primeira ocorrncia da seqncia de caracteres na coluna ou literal, se os dois ltimos parmetros forem omitidos.

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

LTRIM(coluna | literal, 'caracteres')Remove os caracteres indicados esquerda da coluna ou do literal. Se nenhum caracter for especificado, sero eliminados os espaos esquerda.

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.

RTRIM(coluna | literal, 'caracteres')Remove os caracteres indicados direita da coluna ou do literal. Se nenhum caracter for especificado, sero eliminados os espaos direita.

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

TRANSLATE(coluna | literal, de, para)Substitui os caracteres do argumento "de" pelos caracteres do argumento "para", na coluna ou literal especificados. Todas as ocorrncias dos caracteres do parmetro "de" so substitudas pelos caracteres no parmetro "para". Caracteres do parmetro "de" sem correspondncia no parmetro "para" so removidos.

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

REPLACE(coluna | literal, de, para)Substitui a seqncia de caracteres "de" pela seqncia de caracteres "para", na coluna ou literal especificados.

No exemplo abaixo SALESMAN substitudo por VENDEDOR:

48

SQL> SELECT JOB, REPLACE(JOB,'SALESMAN','VENDEDOR') 2 FROM EMP

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.

No exemplo abaixo, "CO" foi substitudo por "PX":SELECT ENAME, REPLACE(ENAME,'CO','PX') FROM EMP ENAME REPLACE(ENAME,'CO','PX') ---------- -----------------------SMITH SMITH ALLEN ALLEN WARD WARD JONES JONES MARTIN MARTIN BLAKE BLAKE CLARK CLARK SCOTT SPXTT 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 numricasROUND(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.

SELECT EXP(4) FROM DUAL EXP(4) ---------54.59815 1 row selected.

LOG(base, coluna | literal)Calcula o logaritmo da coluna ou do literal na base especificada.

SELECT LOG(10,100) FROM DUAL LOG(10,100) ----------2 1 row selected.

LN(coluna | literal)Calcula o logaritmo neperiano da coluna ou do literal.

SELECT LN(95) FROM DUAL LN(95) ---------4.55387689

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

2850 1500 950

0

-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 trigonomtricasCalculam 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 hiperblicasCalculam o seno hiperblico (SINH), coseno hiperblico (COSH) e tangente hiperblica (TANH) da coluna ou literal.

SELECT SINH(1), COSH(0), TANH(.5) FROM DUAL SINH(1) ---------------COSH(0) ---------TANH(.5)

54

1.17520119

1

.462117157

55

Funes que manipulam datasSYSDATESYSDATE uma pseudo-coluna que retorna a data e a hora corrente. A tabela SYS.DUAL pblica, contm apenas uma coluna chamada DUMMY, e uma linha com o valor 'X'. Esta tabela til para retornar um nico valor de uma constante, de uma pseudo-coluna, ou de uma expresso. Abaixo a tabela SYS.DUAL foi utilizada para retornar a data corrente.

SQL> SELECT SYSDATE 2 FROM SYS.DUAL SYSDATE --------25-OCT-94

Aritmtica de datasDatas podem ser somadas ou subtradas de outras datas, ou de valores numricos.

data+nmero data-nmero data-data data+nmero/24

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 conversoFormatos de DataFormato 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

2 - O sufixo 'TH' produz nmeros ordinais ("DDTH" para "4TH")

60

3 - O sufixo 'SP' produz nmeros por extenso ("DDSP" para "FOUR")

4 - O sufixo 'SPTH' para nmeros ordinais por extenso ("DDSPTH" para "FOURTH")

5 - Os cdigos so sensitivos a caracteres maisculos e minsculos

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.

SQL> SELECT TO_CHAR(SYSDATE, 'HH:MI:SS') 2 FROM SYS.DUAL TO_CHAR(SYSDATE,'HH:MI:SS') --------------------------08:39:51

A funo TO_CHAR pode ser usada para converter nmeros em caracteres aplicando a formatao desejada.

SQL> SELECT TO_CHAR(SAL,'$9,999') 2 FROM EMP

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 NumricosFormat 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

Funes que aceitam qualquer tipo de dadoDECODE(coluna|expresso,pes1,res1,[pes2,res2,...],default)Funciona como uma estrutura CASO, substituindo as pesquisas pelos resultados. A coluna ou expresso comparada com os argumentos de pesquisa, e se houver igualdade o resultado correspondente retornado. Se no houver igualdade, o valor default retornado.

Argumentos:

coluna|expresso a coluna ou expresso a ser avaliada pes1 o primeiro valor a ser testado 63

res1 pes1 pes2 res2 pes2 default for diferente

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:

-coluna ou expresso podem ser de qualquer tipo de dados.

-pes(quisa) deve ter o mesmo tipo de dados da coluna ou expresso

-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

Para mostrar as percentagens de bnus relativas s faixas salariais: 64

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

Para fazer um aumento salarial diferenciado por cargo:

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

Converte valores nulos do primeiro argumento no valor especificado no segundo argumento.SQL> SELECT SAL*12+NVL(COMM,0), NVL(COMM,1000), SAL*12+NVL(COMM,1000) 2 FROM EMP 3 WHERE DEPTNO = 10 SAL*12+NVL(COMM,0) NVL(COMM,1000) SAL*12+NVL(COMM,1000) ------------------ ----------------- --------------------29400 1000 30400 60000 1000 61000 15600 1000 16600

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)

Funes aninhadas revisitadasSQL> SELECT ENAME, NVL(TO_CHAR(MGR),'NAO GERENCIAVEL') 2 FROM EMP 3 WHERE MGR IS NULL ENAME NVL(TO_CHAR(MGR),'NAOGERENCIAVEL') ---------- ---------------------------------KING NAO GERENCIAVEL SQL> SELECT SYSDATE, 2 TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'), 3 'Day dd Month YYYY') 4 FROM SYS.DUAL SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY') --------- -------------------------------------------------------25-OCT-94 Friday 30 December 1994

67

Usando funes de grupoPara calcular o salrio mdio de todos os empregados:

SQL> SELECT AVG(SAL) 2 FROM EMP AVG(SAL) ----------------2073.214285714286

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.

Para encontrar o salrio mnimo recebido por um CLERK:

SQL> SELECT MIN(SAL) 2 FROM EMP 3 WHERE JOB='CLERK' MIN(SAL) ----------------800

Para contar o nmero de empregados que trabalham no departamento 20:

SQL> SELECT COUNT(*) 2 FROM EMP 3 WHERE DEPTNO = 20 COUNT(*) ----------------5

A clusula GROUP BYA 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

Para calcular o salrio mdio de cada cargo:

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

Excluindo linhas dos gruposA clusula WHERE pode ser utilizada para excluir linhas, antes que estas sejam grupadas.

Para mostrar o salrio mdio de cada cargo, excluindo os gerentes:

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

Grupos dentro de gruposOs grupos podem conter subgrupos, fornecendo resultados para grupos dentro de grupos.

Para listar o salrio mdio de cada cargo em cada departamento:

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

CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN

1300 2450 5000 3000 950 2975 950 2850 1400

9 rows selected.

Funes disponveis de grupoFuno AVG ([DISTINCT|ALL]n) COUNT ([DISTINCT|ALL]exp*) MAX ([DISTINCT|ALL]exp) MIN ([DISTINCT|ALL]exp) STDDEV ([DISTINCT|ALL]n) SUM ([DISTINCT|ALL]n) VARIANCE ([DISTINCT|ALL]n) Soma dos valores de 'n', ignorando os valores nulos. Varincia de 'n', ignorando os valores nulos. Desvio padro de 'n', ignorando os valores nulos. Valor mnimo da expresso. Nmero de ocorrncias no nulas da expresso. O '*' obriga a contagem total, incluindo valores duplicados e nulos. Valor mximo da expresso. Valor retornado Valor mdio de 'n', ignorando os valores nulos.

Quando DISTINCT especificado, somente os valores no duplicados so considerados pela funo, caso contrrio ALL assumido, considerando todos os valores, inclusive os duplicados.

Todas as funes de grupo, exceto COUNT(*), ignoram os valores nulos.

70

Podem ser fornecidas expresses dos tipos caracter, nmero ou data quando 'exp' estiver indicado. Quando 'n' estiver indicado, somente valores numricos so aceitos.

Funes de grupo e resultados individuaisA declarao abaixo mostra o salrio mximo para cada tipo de cargo. O resultado no muito significativo pois no mostra o cargo, mas mostra que no h obrigao de listar as colunas pelas quais o grupamento realizado.

SQL> SELECT MAX(SAL) 2 FROM EMP 3 GROUP BY JOB MAX(SAL) ----------------3000 1300 2975 5000 1600

Tambm no h necessidade de colocar as colunas a serem grupadas antes das outras:

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

Grupando-se por DEPTNO o comando processa corretamente.

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 HAVINGSomente 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

Para mostrar os cargos com salrio mximo acima de 3000: 72

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

A clusula HAVING deve ser usada neste caso.

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

As clusulas WHERE e HAVING podem ser utilizadas em conjunto.

Para calcular o salrio mdio de todos os cargos, exceto o cargo de gerente:

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

Ordem das clusulasSELECT FROM WHERE GROUP BY HAVING ORDER BY lista_de_colunas lista_de_tabelas condies_de_linha lista_de_colunas condies_de_grupo lista_de_colunas

So avaliados:

WHERE GROUP BY HAVING

para ficar somente as linhas que atendem a clusula para montagem dos grupos para ficar somente os grupos que atendem a clusula

74

Junes equivalentesPara 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.

A condio de juno especificada na clusula WHERE usando o operador '='.

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.

SQL> SELECT DEPT.DEPTNO, ENAME, JOB, DNAME 2 FROM EMP, DEPT

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.

ProdutoQuando a condio de juno invlida ou omitida completamente, o resultado um Produto Cartesiano, e todas as combinaes de linha sero retornadas. 76

O Produto tende a gerar um grande nmero de linhas, e o resultado raramente til.

Junes no equivalentesO 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 130