57336316 apostila oracle

Upload: rit-ler-antonio-de-almeida

Post on 06-Jul-2015

258 views

Category:

Documents


2 download

TRANSCRIPT

Captulo 1: Conceitos de Banco de Dados1.1 Objetivos deste captulo Introduzir os conceitos bsico de sistema gerenciador de banco de dados, banco de dados relacional, lgebra relacional, e a arquitetura do Oracle.

1.2

Sistema de Gerenciamento de Banco de Dados O 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. 1.3 Banco de dados relacional O 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, e nada alm de tabelas. Os trs elementos de um banco de dados relacional so: tabelas colunas linhas

1

Os operadores relacionais so: 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. Seleo/Restrio

Projeo

Unio Interseo Diferena Produto

Juno

Projeo

2

Unio

Interseo

Diferena

3

Produto

Joo Jos Manoel

x

Pintor Escritor

=

Joo Joo Jos Jos Manoel Manoel

Pintor Escritor Pintor Escritor Pintor Escritor

Juno

Joo Jos Maria Ana

10 10 20 30

10 20 30 40

Vendas Pesq. Cont. Secret.

Joo Jos Maria Ana

10 10 20 30

10 10 20 30

Vendas Vendas Pesq. Cont.

1.4

Arquitetura do OracleBackground Processes

System Global Area

Banco de DadosServers

Redo Log Files

Users Data Files

Control Files

O SGBD: Estruturas de memria: System Global Area (SGA) uma regio compartilhada de memria alocada pelo SGBD Oracle, que contm dados e informaes de controle. Quanto maior for a SGA melhor ser o desempenho do Oracle. Os dados da SGA so compartilhados por 4

todos os usurios que esto acessando o banco de dados. As informaes armazenadas na SGA esto divididas por tipo de estrutura de memria, incluindo database buffers, redo log buffers e shared poll. Program Global Area (PGA) uma rea de memria que contm dados e informaes de controle para um processo servidor. Uma PGA criada pelo Oracle quando um processo servidor iniciado. Processos: Os processos so divididos em Processos Usurio e Processos do Oracle. Cada usurio conectado possui um Processo Usurio, atravs do qual se comunica com o Oracle. Entre os processos do Oracle esto os Processos Servidores, que executam as solicitaes emitidas pelo Processos Usurios, e os Processos Background. O Banco de dados: Data Files Redo Log Files Contm todos os dados do banco de dados. Contm todas as informaes relativas s alteraes efetuadas no banco de dados para permitir a recuperao. Registra a estrutura fsica do banco de dados.

Control Files

5

Captulo 2: Introduo s Consultas2.1 Objetivos deste captulo Este captulo faz uma introduo linguagem de consulta utilizada para acessar o Banco de Dados Oracle. Em particular, so discutidas as declaraes utilizadas para:

realizar clculos manusear valores nulos corretamente nomes alternativos para ttulos das colunas concatenar colunas ordenar linhas fornecer critrios de pesquisa

2.2

O utilitrio SQL*PLUS O SQL*PLUS uma interface atravs da qual os comandos SQL podem ser entrados e executados. O SQL*PLUS possui outros comandos, que permitem formatar a sada dos comandos SQL, alm de fornecer facilidades para editar e salvar comandos SQL. Para ativar o SQL*PLUS digite SQLPLUS na linha de comando do MS-DOS, e pressione a tecla Enter. Quando o SQLPLUS solicitar para entrar com o nome do usurio digite ALUNO1, e quando for solicitada a senha fornea ALUNO1 novamente. As linhas de comando do SQL*PLUS so prefixadas por: SQL>. As linhas de continuao so numeradas. Todo o curso est baseado na utilizao desta ferramenta pelos participantes. Os comandos podem ser escritos em uma ou mais linhas.

2.3

Construo bsica de uma consulta O 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: 6

SQL> SELECT DEPTNO, ENAME, MGR 2 FROM EMP DEPTNO ------20 30 30 20 30 30 10 20 10 30 20 30 20 10 ENAME MGR ---------- ------SMITH 7902 ALLEN 7698 WARD 7698 JONES 7839 MARTIN 7698 BLAKE 7839 CLARK 7839 SCOTT 7566 KING TURNER 7698 ADAMS 7788 JAMES 7698 FORD 7566 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 EMPNO ------7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB MGR HIREDATE SAL COMM DEPTNO --------- ------- --------- ------- ------- ------CLERK 7902 13-JUN-83 800 20 SALESMAN 7698 15-AUG-83 1600 300 30 SALESMAN 7698 26-MAR-84 1250 500 30 MANAGER 7839 31-OCT-83 2975 20 SALESMAN 7698 05-DEC-83 1250 1400 30 MANAGER 7839 11-JUN-84 2850 30 MANAGER 7839 14-MAY-84 2450 10 ANALYST 7566 05-MAR-84 3000 20 PRESIDENT 09-JUL-84 5000 10 SALESMAN 7698 04-JUN-84 1500 0 30 CLERK 7788 04-JUN-84 1100 20 CLERK 7698 23-JUL-84 950 30 ANALYST 7566 05-DEC-83 3000 20 CLERK 7782 21-NOV-83 1300 10

14 rows selected.

2.4

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.SQL> SELECT ENAME, SAL*12, COMM 2 FROM EMP

7

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 JAMES 11400 FORD 36000 MILLER 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

8

BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

37200 32400 39000 63000 21000 16200 14400 39000 18600

2.5

Nomes alternativos para ttulos de colunas Para 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. 2.6 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:SQL> SELECT EMPNO||ENAME EMPREGADO 2 FROM EMP

9

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

2.7

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.SQL> SQL> 2 3 4 COLUMN EMPREGADO FORMAT A20 SELECT EMPNO||'-'||ENAME EMPREGADO, 'TRABALHA NO DEPARTAMENTO', DEPTNO FROM EMP 'TRABALHANODEPARTAMENTO' DEPTNO ------------------------ ------TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 10 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 10 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 30 TRABALHA NO DEPARTAMENTO 20 TRABALHA NO DEPARTAMENTO 10

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

2.8

Manuseio de valores nulos 10

Se 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 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 11

b)

um valor no nulo

Podem ser convertidos valores nulos de data, nmeros, ou caracteres: NVL(ColunaData, 01-jan-84') NVL(ColunaNumero, 9) NVL(ColunaCaracter, alfanumrico') 2.9 Eliminao de linhas duplicadas A 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 ------10 10 10 20 20 20 JOB --------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER

12

30 CLERK 30 MANAGER 30 SALESMAN

Acima esto mostradas todas as combinaes diferentes de departamentos e cargos. 2.10 Ordenao das linhas Normalmente, 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 ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD JOB SAL*12 DEPTNO --------- ------- ------CLERK 13200 20 SALESMAN 19200 30 MANAGER 34200 30 MANAGER 29400 10 ANALYST 36000 20 CLERK 11400 30 MANAGER 35700 20 PRESIDENT 60000 10 SALESMAN 15000 30 CLERK 15600 10 ANALYST 36000 20 CLERK 9600 20 SALESMAN 18000 30 SALESMAN 15000 30

14 rows selected.

Ordem padro de ordenao: - Nmeros: menores primeiro - Data: mais cedo primeiro - Caracteres: ordem alfabtica 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 ---------JAMES KING BLAKE TURNER ADAMS CLARK JOB --------CLERK PRESIDENT MANAGER SALESMAN CLERK MANAGER HIREDATE --------23-JUL-84 09-JUL-84 11-JUN-84 04-JUN-84 04-JUN-84 14-MAY-84

13

WARD SCOTT MARTIN FORD MILLER JONES ALLEN SMITH

SALESMAN ANALYST SALESMAN ANALYST CLERK MANAGER SALESMAN CLERK

26-MAR-84 05-MAR-84 05-DEC-83 05-DEC-83 21-NOV-83 31-OCT-83 15-AUG-83 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 ------10 10 10 20 20 20 20 20 30 30 30 30 30 30 JOB --------PRESIDENT MANAGER CLERK ANALYST ANALYST MANAGER CLERK CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK ENAME ---------KING CLARK MILLER SCOTT FORD JONES ADAMS SMITH BLAKE ALLEN TURNER WARD MARTIN JAMES

Exerccio: verificar como ficam os valores nulos aps a ordenao. 2.11 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: - 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' ENAME EMPNO JOB DEPTNO ---------- ------- --------- ------SMITH 7369 CLERK 20 ADAMS 7876 CLERK 20 JAMES 7900 CLERK 30 MILLER 7934 CLERK 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... IN(lista) LIKE IS NULL entre dois valores (inclusive) 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 ---------- ------ALLEN 1600 WARD 1250 MARTIN 1250 TURNER 1500 ADAMS 1100 MILLER 1300

15

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 ------7369 7788 7876 7902 ENAME SAL MGR ---------- ------- ------SMITH 800 7902 SCOTT 3000 7566 ADAMS 1100 7788 FORD 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 ---------WARD KING FORD

(quatro caracteres de sublinhado)

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

16

Os operadores mostrados abaixo podem ser utilizados para testes de negao: != ^= NOT NomeDaColuna = NOT NomeDaColuna > NOT BETWEEN NOT IN NOT LIKE IS NOT NULL no igual no igual a no maior do que fora da faixa especificada fora da lista especificada no semelhante ao modelo no nulo

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 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 JAMES 950 FORD 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 ---------SMITH ALLEN WARD MARTIN SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB --------CLERK SALESMAN SALESMAN SALESMAN ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST 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

17

ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES FORD MILLER

7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782

x NULL e x = NULL sempre falso. Nulo nunca igual a nada nem diferente de nada, nem a outro nulo. 2.12 Consultas com condies mltiplas Os 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> 2 3 4 SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB = 'CLERK' ENAME ---------ADAMS MILLER JOB SAL --------- ------CLERK 1100 CLERK 1300

EMPNO ------7876 7934

Para listar os funcionrios que so CLERK, ou que recebem entre 1000 e 2000, usamos:SQL> 2 3 4 SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB = CLERK' ENAME ---------SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER JOB SAL --------- ------CLERK 800 SALESMAN 1600 SALESMAN 1250 SALESMAN 1250 SALESMAN 1500 CLERK 1100 CLERK 950 CLERK 1300

EMPNO ------7369 7499 7521 7654 7844 7876 7900 7934

Quando aparecem tanto ANDs quanto ORs em uma expresso lgica, todos os ANDs so processados antes que os ORs sejam processados. 18

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> 2 3 4 5 SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND JOB = 'MANAGER' OR JOB = 'SALESMAN' ENAME ---------ALLEN WARD JONES MARTIN BLAKE CLARK TURNER JOB SAL DEPTNO --------- ------- ------SALESMAN 1600 30 SALESMAN 1250 30 MANAGER 2975 20 SALESMAN 1250 30 MANAGER 2850 30 MANAGER 2450 10 SALESMAN 1500 30

EMPNO ------7499 7521 7566 7654 7698 7782 7844

Para selecionar todos os vendedores e gerentes com salrio superior a 1500, usamos:SQL> 2 3 4 SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND ( JOB = 'MANAGER' OR JOB = SALESMAN' ) ENAME ---------ALLEN JONES BLAKE CLARK JOB SAL DEPTNO --------- ------- ------SALESMAN 1600 30 MANAGER 2975 20 MANAGER 2850 30 MANAGER 2450 10

EMPNO ------7499 7566 7698 7782

Os parnteses especificam a ordem em que os operadores devem ser calculados. 2.13 Precedncia dos operadores a) os operadores de comparao e os operadores SQL tem precedncias iguais. =, !=, , =, 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

19

7698 BLAKE 7782 CLARK 7934 MILLER

MANAGER MANAGER CLERK

7839 11-JUN-84 7839 14-MAY-84 7782 21-NOV-83

2850 2450 1300

30 10 10

Neste caso os parnteses so desnecessrios, uma vez que o AND processa primeiro. 2.14 Resumo do comando SELECT SELECT FROM WHERE ORDER BY 2.15 Exerccios a) Selecionar todas as informaes da tabela SALGRADEGRADE LOSAL HISAL ------- ------- ------1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999

[DISTINCT] {* | coluna [alis],....} tabela condies {coluna | expresso} [ASC|DESC]

b) Selecionar todas a informaes da tabela EMPEMPNO ------7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB MGR HIREDATE SAL COMM DEPTNO --------- ------- --------- ------- ------- ------CLERK 7902 13-JUN-83 800 20 SALESMAN 7698 15-AUG-83 1600 300 30 SALESMAN 7698 26-MAR-84 1250 500 30 MANAGER 7839 31-OCT-83 2975 20 SALESMAN 7698 05-DEC-83 1250 1400 30 MANAGER 7839 11-JUN-84 2850 30 MANAGER 7839 14-MAY-84 2450 10 ANALYST 7566 05-MAR-84 3000 20 PRESIDENT 09-JUL-84 5000 10 SALESMAN 7698 04-JUN-84 1500 0 30 CLERK 7788 04-JUN-84 1100 20 CLERK 7698 23-JUL-84 950 30 ANALYST 7566 05-DEC-83 3000 20 CLERK 7782 21-NOV-83 1300 10

14 rows selected.

c) Listar todos os funcionrios com salrio entre 1000 e 2000ENAME DEPTNO SAL ---------- ------- ------ALLEN 30 1600 WARD 30 1250 MARTIN 30 1250 TURNER 30 1500 ADAMS 20 1100 MILLER 10 1300 6 rows selected.

d) Listar os nmeros e os nomes dos departamentos, ordenados pelo nome do departamento 20

DEPTNO ------10 40 20 30

DNAME -------------ACCOUNTING OPERATIONS RESEARCH SALES

e) Listar os diferentes tipos de cargoJOB --------ANALYST CLERK MANAGER PRESIDENT SALESMAN

f) Listar os detalhes dos empregados dos departamentos 10 e 20 em ordem alfabtica de nome.EMPNO ------7876 7782 7902 7566 7839 7934 7788 7369 ENAME ---------ADAMS CLARK FORD JONES KING MILLER SCOTT SMITH JOB MGR HIREDATE SAL COMM DEPTNO --------- ------- --------- ------- ------- ------CLERK 7788 04-JUN-84 1100 20 MANAGER 7839 14-MAY-84 2450 10 ANALYST 7566 05-DEC-83 3000 20 MANAGER 7839 31-OCT-83 2975 20 PRESIDENT 09-JUL-84 5000 10 CLERK 7782 21-NOV-83 1300 10 ANALYST 7566 05-MAR-84 3000 20 CLERK 7902 13-JUN-83 800 20

g) Listar os nomes e os cargos de todos os CLERK do departamento 20.ENAME ---------SMITH ADAMS JOB --------CLERK CLERK

h) Listar os nomes de todos os empregados onde aparece TH ou LL no nome.ENAME ---------SMITH ALLEN MILLER

i) Listar os seguintes detalhes dos funcionrios que tem gerente.ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES JOB SAL --------- ------CLERK 800 SALESMAN 1600 SALESMAN 1250 MANAGER 2975 SALESMAN 1250 MANAGER 2850 MANAGER 2450 ANALYST 3000 SALESMAN 1500 CLERK 1100 CLERK 950

21

FORD MILLER

ANALYST CLERK

3000 1300

j) Mostrar o nome e a remunerao total de todos os empregados.ENAME REMUNERACAO ---------- ----------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

k) Mostrar todos os empregados que foram admitidos em 1983.ENAME DEPTNO HIREDATE ---------- ------- --------SMITH 20 13-JUN-83 ALLEN 30 15-AUG-83 JONES 20 31-OCT-83 MARTIN 30 05-DEC-83 FORD 20 05-DEC-83 MILLER 10 21-NOV-83

l) Mostrar o nome, o salrio anual e comisso, de todos os vendedores com salrio mensal maior do que a comisso. O resultado deve ser ordenado com os maiores salrios na frente. Se dois ou mais empregados tiverem o mesmo salrio, deve ser ordenado pelo nome do funcionrio.ENAME SALARIO_ANUAL COMM ---------- ------------- ------ALLEN 19200 300 TURNER 18000 0 WARD 15000 500

m) Selecione os dados para reproduzir a sada mostrada abaixo.QUEM, O QUE, QUANDO --------------------------------------------------------------------SMITH TEM A POSICAO DE CLERK NO DEPARTAMENTO 20 DESDE 13-JUN-83 ALLEN TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 15-AUG-83 WARD TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 26-MAR-84 JONES TEM A POSICAO DE MANAGER NO DEPARTAMENTO 20 DESDE 31-OCT-83 MARTIN TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 05-DEC-83 BLAKE TEM A POSICAO DE MANAGER NO DEPARTAMENTO 30 DESDE 11-JUN-84 CLARK TEM A POSICAO DE MANAGER NO DEPARTAMENTO 10 DESDE 14-MAY-84 SCOTT TEM A POSICAO DE ANALYST NO DEPARTAMENTO 20 DESDE 05-MAR-84 KING TEM A POSICAO DE PRESIDENT NO DEPARTAMENTO 10 DESDE 09-JUL-84 TURNER TEM A POSICAO DE SALESMAN NO DEPARTAMENTO 30 DESDE 04-JUN-84 ADAMS TEM A POSICAO DE CLERK NO DEPARTAMENTO 20 DESDE 04-JUN-84 JAMES TEM A POSICAO DE CLERK NO DEPARTAMENTO 30 DESDE 23-JUL-84 FORD TEM A POSICAO DE ANALYST NO DEPARTAMENTO 20 DESDE 05-DEC-83 MILLER TEM A POSICAO DE CLERK NO DEPARTAMENTO 10 DESDE 21-NOV-83

22

2.16

Respostas dos exercciosa) SQL> SELECT * 2 FROM SALGRADE b) SQL> SELECT * 2 FROM EMP c) SQL> SELECT ENAME, DEPTNO, SAL 2 FROM EMP 3 WHERE SAL BETWEEN 1000 AND 2000 d) SQL> SELECT DEPTNO, DNAME 2 FROM DEPT 3 ORDER BY DNAME e) SQL> SELECT DISTINCT JOB 2 FROM EMP f) SQL> SELECT * 2 FROM EMP 3 WHERE DEPTNO IN(10,20) 4 ORDER BY ENAME g) SQL> SELECT ENAME, JOB 2 FROM EMP 3 WHERE JOB = CLERK' 4 AND DEPTNO = 20 h) SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME LIKE '%TH%' 4 OR ENAME LIKE '%LL%' i) SQL> SELECT ENAME, JOB, SAL 2 FROM EMP 3 WHERE MGR IS NOT NULL j) SQL> SELECT ENAME, SAL*12+NVL(COMM,0) REMUNERACAO 2 FROM EMP k) SQL> SELECT ENAME, DEPTNO, HIREDATE 2 FROM EMP 3 WHERE HIREDATE LIKE '%83' l) SQL> SELECT ENAME, SAL*12 SALARIO_ANUAL, COMM 2 FROM EMP 3 WHERE SAL > COMM 4 AND JOB = 'SALESMAN' 5 ORDER BY SAL DESC, ENAME m) SQL> SELECT ENAME||' TEM A POSICAO DE '||JOB|| 2 ' NO DEPARTAMENTO '||DEPTNO|| 3 ' DESDE '||HIREDATE "QUEM, O QUE, QUANDO" 4 FROM EMP

23

Captulo 3: Variveis de Substituio3.1 Objetivos deste captulo Descrever as variveis de substituio e como estas so usadas nas declaraes SQL. 3.2 Variveis de substituio com um "&" A varivel de substituio pode ser utilizada em uma declarao SELECT, representando um valor a ser fornecido quando o comando for executado.SQL> SELECT EMPNO, ENAME, SAL 2 FROM EMP 3 WHERE DEPTNO = &NUMERO_DO_DEPARTAMENTO Enter value for numero_do_departamento: 10 old new 3: WHERE DEPTNO = &NUMERO_DO_DEPARTAMENTO 3: WHERE DEPTNO = 10 ENAME SAL ---------- ------CLARK 2450 KING 5000 MILLER 1300

EMPNO ------7782 7839 7934

3.3

Variveis de substituio com dois "&" Quando so utilizados dois "&" na varivel, o SQL*PLUS solicita o valor da varivel apenas uma vez, guardando este valor para uso subseqente. Exemplo: &&NUMERO_DO_DEPARTAMENTO

24

Captulo 4: Funes Numricas e de Caracteres4.1 Objetivos deste captulo Este captulo mostra as funes do Oracle que manipulam nmeros e sequncias de caracteres. 4.2 Funes que manipulam caracteres 4.2.1 LOWER(coluna | literal) Transforma letras maisculas em minsculas.SQL> SELECT LOWER(DNAME), LOWER('CURSO DE SQL') 2 FROM DEPT LOWER(DNAME) -------------accounting research sales operations LOWER('CURSODESQL') -------------------curso de sql curso de sql curso de sql curso de sql

4.2.2 UPPER(coluna | literal) Transforma letras minsculas em maisculas.SQL> SELECT ENAME 2 FROM EMP 3 WHERE ENAME = UPPER('smith') ENAME ---------SMITH

4.2.3 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) -------------------Accounting Research Sales Operations INITCAP(LOC) -------------------New York Dallas Chicago Boston

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

25

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

4.2.5 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,'*') -------------------ACCOUNTING********** RESEARCH************ SALES*************** OPERATIONS********** RPAD(DNAME,20) -------------------ACCOUNTING RESEARCH SALES OPERATIONS RPAD(DEPTNO,20,'.') -------------------10.................. 20.................. 30.................. 40..................

4.2.6 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 SUBSTR('ORACLE',2,4) -------------------RACL RACL RACL RACL SUBSTR(DNAME,2) --------------CCOUNTING ESEARCH ALES PERATIONS SUBSTR(DNAME,3,5) -------------------COUNT SEARC LES ERATI

4.2.7 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

26

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

4.2.8 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 -------------ACCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME,'A') ---------------CCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME,'AS') ----------------CCOUNTING RESEARCH LES OPERATIONS LTRIM(DNAME,'ASOP') ------------------CCOUNTING RESEARCH LES 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 "A" quanto a letra "S". Na quarta coluna foram removidas as letras "A", "S", "O" e "P" esquerda. 4.2.9 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 -------------ACCOUNTING RESEARCH SALES OPERATIONS RTRIM(DNAME,'G') ---------------ACCOUNTIN RESEARCH SALES OPERATIONS RTRIM(DNAME,'GHS') -----------------ACCOUNTIN RESEARC SALE OPERATION RTRIM(DNAME,'N') ---------------ACCOUNTING RESEARCH SALES OPERATIONS

4.2.10 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

27

4.2.11 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) --------------------- --------------------- --------------------12 2 10 12 2 8 12 2 5 12 2 10

4.2.12 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 ---------CLARK KING MILLER TRANSLATE(ENAME,'C','P') ------------------------PLARK KING 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 --------MANAGER PRESIDENT CLERK TRANSLATE(JOB,'AR','IT') -----------------------------MINIGET PTESIDENT CLETK

4.2.13 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:SQL> SELECT JOB, REPLACE(JOB,'SALESMAN','VENDEDOR') 2 FROM EMP

28

JOB --------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

REPLACE(JOB,'SALESMAN','VENDEDOR') ---------------------------------------CLERK VENDEDOR VENDEDOR MANAGER VENDEDOR MANAGER MANAGER ANALYST PRESIDENT VENDEDOR CLERK CLERK ANALYST CLERK

14 rows selected.

No exemplo abaixo, "CO" foi substitudo por "PX":SELECT ENAME, REPLACE(ENAME,'CO','PX') FROM EMP ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER REPLACE(ENAME,'CO','PX') -----------------------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK 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

29

4.3

Funes numricas 4.3.1 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

4.3.2 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

4.3.3 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

4.3.4 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

30

FLOOR(SAL) FLOOR(99.9) FLOOR(101.76) FLOOR(-11.1) ---------- ----------- ------------- -----------3000 99 101 -12 5000 99 101 -12 3000 99 101 -12

4.3.5 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

4.3.6 EXP(coluna | literal) Eleva e (2.71828183...) coluna ou literal.SELECT EXP(4) FROM DUAL EXP(4) ---------54.59815 1 row selected.

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

4.3.8 LN(coluna | literal) Calcula o logaritmo neperiano da coluna ou do literal.SELECT LN(95) FROM DUAL LN(95) ---------4.55387689

4.3.9 SQRT(coluna | literal) Retorna a raiz quadrada da coluna ou do literal.

31

SQL> SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM) 2 FROM EMP 3 WHERE COMM > 0 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

4.3.10 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 SIGN(COMM-SAL) ----------------- ----------------- ----------------- ----------------1300 1 -1300 -1 750 1 -750 -1 -150 -1 150 1 1500 1 -1500 -1

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

4.3.11 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 2850 1500 0 -1500 1500 950

4.3.12 MOD(valor1, valor2) Retorna o resto da diviso de valor1 por valor2.

32

SQL> 2 3 4

SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40) FROM EMP WHERE DEPTNO = 30 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

4.3.13 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 ---------.5 COS(60*3.1 ---------.5 TAN(45*3.1 ---------1

4.3.14 Funes hiperblicas Calculam 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) ---------1.17520119 COSH(0) ------1 TANH(.5) ---------.462117157

4.4

Exerccios a) Listar o nmero do departamento, o nome do funcionrio, e o salrio com aumento de 15% expresso em nmero inteiro.DEPTNO ----------------20 30 30 20 30 30 10 20 10 30 20 30 20 10 ENAME PCTSAL ---------- ----------------SMITH 920 ALLEN 1840 WARD 1438 JONES 3421 MARTIN 1438 BLAKE 3278 CLARK 2818 SCOTT 3450 KING 5750 TURNER 1725 ADAMS 1265 JAMES 1093 FORD 3450 MILLER 1495

33

b) Gerar a listagem mostrada a seguir:EMPREGADO_E_CARGO -------------------SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER CLERK 14 rows selected.

c) Listar uma lista contendo todos os empregados com um identificador composto pelas duas primeiras letras de seus cargos, os dois dgitos do meio de seus nmeros de matrcula, e o cdigo sonoro de seus nomes.NOME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER CODIGO -------CL36S530 SA49A450 SA52W630 MA56J520 SA65M635 MA69B420 MA78C462 AN78S300 PR83K520 SA84T656 CL87A352 CL90J520 AN90F630 CL93M460

d) Faa uma procura no sensitiva a letras maisculas ou minsculas por um cargo fornecido pelo usurio.EMPNO ----7369 7876 7900 7934 ENAME ---------SMITH ADAMS JAMES MILLER JOB MGR HIREDATE SAL COMM DEPTNO --------- ----- --------- ----- ----- -----CLERK 7902 13-JUN-83 800 20 CLERK 7788 04-JUN-84 1100 20 CLERK 7698 23-JUL-84 950 30 CLERK 7782 21-NOV-83 1300 10

e) Imprima os nomes dos departamentos centrados em um campo com largura de 20 posies.DEPARTAMENTO -------------------ACCOUNTING RESEARCH SALES OPERATIONS

34

f) Encontrar a primeira ocorrncia da letra "L" nos nomes dos empregados e substituir pela letra "X".ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER PRIMEIRA_OCORRENCIA_ -------------------SMITH AXLEN WARD JONES MARTIN BXAKE CXARK SCOTT KING TURNER ADAMS JAMES FORD MIXLER

14 rows selected.

35

4.5

Respostas dos exercciosa) SQL> SELECT DEPTNO, ENAME, ROUND (SAL*1.15) PCTSAL 2 FROM EMP b) SQL> SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPREGADO_E_CARGO 2 FROM EMP c) SQL> SELECT ENAME NOME, 2 SUBSTR(JOB,1,2)||SUBSTR(EMPNO,2,2)||SOUNDEX(ENAME) CODIGO 3 FROM EMP d) SQL> SELECT * 2 FROM EMP 3 WHERE UPPER(JOB) = UPPER ('&JOB') Enter value for job: clerk old 3: WHERE UPPER(JOB) = UPPER ('&JOB') new 3: WHERE UPPER(JOB) = UPPER ('clerk') e) SQL> SELECT LPAD(' ',(20-LENGTH(DNAME))/2)||DNAME DEPARTAMENTO 2 FROM DEPT f) SQL> 2 3 4 SELECT ENAME, TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')|| SUBSTR(ENAME,INSTR(ENAME,'L')+1) PRIMEIRA_OCORRENCIA_DE_L FROM EMP

36

Captulo 5: Funes de Data e de Converso5.1 Objetivos deste captulo Este captulo mostra as funes do Oracle que manipulam datas e fazem a converso de tipo de dados. 5.2 Funes que manipulam datas 5.2.1 SYSDATE SYSDATE 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

5.2.2 Aritmtica de datas Datas 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 --------13-JUN-83 11-JUN-84 04-JUN-84 04-JUN-84 HIREDATE+7 ---------20-JUN-83 18-JUN-84 11-JUN-84 11-JUN-84 HIREDATE-7 ---------06-JUN-83 04-JUN-84 28-MAY-84 28-MAY-84 SYSDATE-HIREDATE ----------------4152.351851851852 3788.351851851852 3795.351851851852 3795.351851851852

A operao SYSDATE-HIREDATE retorna o nmero de dias entre a admisso do empregado e a data atual. 5.2.3 MONTHS_BETWEEN(data1,data2) Retorna o nmero de meses decorridos entre data1 e data2.SQL> 2 3 4 SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE), MONTHS_BETWEEN('01-JAN-84','05-NOV-88') FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE) > 59

37

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.

5.2.4 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 --------13-JUN-83 31-OCT-83 05-MAR-84 04-JUN-84 05-DEC-83 ADD_MONTHS(HIREDATE,3) ---------------------13-SEP-83 31-JAN-84 05-JUN-84 04-SEP-84 05-MAR-84 ADD_MONTHS(HIREDATE,-3) ----------------------13-MAR-83 31-JUL-83 05-DEC-83 04-MAR-84 05-SEP-83

5.2.5 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 --------14-MAY-84 09-JUL-84 21-NOV-83 NEXT_DAY(HIREDATE,'FRIDAY') --------------------------18-MAY-84 13-JUL-84 25-NOV-83 NEXT_DAY(HIREDATE,6) -------------------18-MAY-84 13-JUL-84 25-NOV-83

5.2.6 LAST_DAY(data) Retorna a data do ltimo dia do ms da data especificada.SQL> 2 3 4 SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88') FROM EMP WHERE DEPTNO = 20

38

SYSDATE --------25-OCT-94 25-OCT-94 25-OCT-94 25-OCT-94 25-OCT-94

LAST_DAY (SYSDATE) ---------31-OCT-94 31-OCT-94 31-OCT-94 31-OCT-94 31-OCT-94

HIREDATE --------13-JUN-83 31-OCT-83 05-MAR-84 04-JUN-84 05-DEC-83

LAST_DAY (HIREDATE) ---------30-JUN-83 31-OCT-83 31-MAR-84 30-JUN-84 31-DEC-83

LAST_DAY ('15-FEB-88') ------------29-FEB-88 29-FEB-88 29-FEB-88 29-FEB-88 29-FEB-88

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

5.2.7 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

5.3

Funes de converso 5.3.1 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 39

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... "..." Notas:

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

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") 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 5.3.2 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: 40

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

5.3.3 Formatos Numricos Formato 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. 41 Exemplo 999999 099999 $99999 999999.99 999,999 099999MI 999999PR 99.999EEEE 9999V99 B9999.99 1234 001234 $1234 1234.00 1,234 1234(1234) 1.234E+03 123400 1234.00

5.3.4 TO_NUMBER(cadeia_de_caracteres) Converte a cadeia de caracteres, que deve conter um nmero, em um valor numrico.SQL> SELECT EMPNO, ENAME, JOB, SAL 2 FROM EMP 3 WHERE SAL > TO_NUMBER('1500') EMPNO ----7499 7566 7698 7782 7788 7839 7902 ENAME ---------ALLEN JONES BLAKE CLARK SCOTT KING FORD JOB SAL --------- ------SALESMAN 1600 MANAGER 2975 MANAGER 2850 MANAGER 2450 ANALYST 3000 PRESIDENT 5000 ANALYST 3000

7 rows selected.

5.3.5 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 ----7844 7876 ENAME ---------TURNER ADAMS HIREDATE --------04-JUN-84 04-JUN-84

5.4

Funes que aceitam qualquer tipo de dado 5.4.1 DECODE(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 pes1 res1 pes2 res2 default a coluna ou expresso a ser avaliada o primeiro valor a ser testado o valor a ser retornado se coluna ou expresso igual a pes1 o segundo valor a ser testado o valor a ser retornado se coluna ou expresso igual a pes2 o valor a ser retornado se a coluna ou expresso for diferente de pes1, pes2,...,pesN.

Notas: 42

-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> 2 3 4 SELECT ENAME, JOB, DECODE(JOB, 'CLERK','WORKER','MANAGER','BOSS','UNDEFINED') DECODED_JOB FROM EMP JOB --------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK DECODED_JOB ----------WORKER UNDEFINED UNDEFINED BOSS UNDEFINED BOSS BOSS UNDEFINED UNDEFINED UNDEFINED WORKER WORKER UNDEFINED WORKER

ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

Para mostrar as percentagens de bnus relativas s faixas salariais:SQL> SELECT GRADE, 2 DECODE(GRADE,'1','15%','2','10%','3','8%','5%') BONUS 3 FROM SALGRADE GRADE ----1 2 3 4 5 BONUS ----15% 10% 8% 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> 2 3 4 SELECT JOB, SAL, DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15, 'MANAGER',SAL*0.95, SAL) SALARIO_DECODIFICADO FROM EMP

43

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.

5.4.2 NVL(coluna|valor, valor) 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

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

5.4.4 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) ----------------- -----------------

44

1000 1000 1000 1000 1000 1000

300 500 1250 0

5.4.5 VSIZE(coluna|valor) Retorna o nmero de bytes utilizado internamente pelo Oracle para representar o valor.SQL> 2 3 4 SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), VSIZE(SAL), VSIZE(ENAME) FROM EMP WHERE DEPTNO = 10

DEPTNO VSIZE(DEPTNO) VSIZE(HIREDATE) VSIZE(SAL) VSIZE(ENAME) ------- --------------- --------------- --------------- --------------10 2 7 3 5 10 2 7 2 4 10 2 7 2 6

5.4.5 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> 2 3 4 SELECT SYSDATE, TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'), 'Day dd Month YYYY') FROM SYS.DUAL

SYSDATE TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'DAYDDMONTHYYYY') --------- -------------------------------------------------------25-OCT-94 Friday 30 December 1994

5.5

Exerccios a) Mostrar o nome e a data de admisso dos empregados do departamento 20. Utilize o alis DATA_DE_ADMISSAO para o nome da coluna.ENAME ---------SMITH JONES SCOTT ADAMS FORD DATA_DE_ADMISSAO --------------------------June, Thirteenth 1983 October, Thirty-First 1983 March, Fifth 1984 June, Fourth 1984 December, Fifth 1983

b) Exibir o nome de cada empregado, juntamente com a data de admisso e a data de reviso do salrio. Assuma a data de reviso um ano aps a data de admisso. Classificar a sada em ordem ascendente da data de reviso do salrio.ENAME HIREDATE REVISAO

45

---------SMITH ALLEN JONES MILLER MARTIN FORD SCOTT WARD CLARK TURNER ADAMS BLAKE KING JAMES

--------13-JUN-83 15-AUG-83 31-OCT-83 21-NOV-83 05-DEC-83 05-DEC-83 05-MAR-84 26-MAR-84 14-MAY-84 04-JUN-84 04-JUN-84 11-JUN-84 09-JUL-84 23-JUL-84

--------13-JUN-84 15-AUG-84 31-OCT-84 21-NOV-84 05-DEC-84 05-DEC-84 05-MAR-85 26-MAR-85 14-MAY-85 04-JUN-85 04-JUN-85 11-JUN-85 09-JUL-85 23-JUL-85

c) Imprimir uma lista de empregados mostrando o salrio, se este for superior a 1500. Se o salrio for inferior a 1500 deve ser exibido ABAIXO DE 1500, e se for igual a 1500 deve ser exibido NO LIMITE.ENAME ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD SALARIO -------------ABAIXO DE 1500 1600 2850 2450 3000 ABAIXO DE 1500 2975 5000 ABAIXO DE 1500 ABAIXO DE 1500 3000 ABAIXO DE 1500 NO LIMITE ABAIXO DE 1500

d) Escreva uma consulta que retorne o dia da semana para qualquer data entrada no formato DD.MM.YY.DIA -------SATURDAY

e) Escreva uma consulta que retorne o tempo que o empregado est trabalhando para a empresa.ENAME TEMPO DE SERVICO ---------- ---------------KING 10 ANOS 3 MESES

f) Dada uma cadeia de caracteres no formato 'nn/nn', verifique se os dois primeiros e os dois ltimos caracteres so numricos, e se o caracter do meio uma '/'. Imprima a expresso 'SIM' se for vlido, e 'NAO' se no for vlido. Experimente as expresses '12/34','01/1a','e '99\88'.VALOR VALIDO? ----- ------12/34 SIM

46

g) Empregados admitidos at o dia 15, inclusive, so pagos na ltima sexta-feira do ms. Empregados admitidos aps o dia 15 so pagos na ltima sexta-feira do ms seguinte. Imprima uma relao contendo os nome dos empregados, as datas de admisso, e a primeira data de pagamento.ENAME ---------SMITH ALLEN JONES MILLER MARTIN FORD SCOTT WARD CLARK TURNER ADAMS BLAKE KING JAMES HIREDATE --------13-JUN-83 15-AUG-83 31-OCT-83 21-NOV-83 05-DEC-83 05-DEC-83 05-MAR-84 26-MAR-84 14-MAY-84 04-JUN-84 04-JUN-84 11-JUN-84 09-JUL-84 23-JUL-84 DIA_DO_PAGAMENTO ---------------24-JUN-83 26-AUG-83 25-NOV-83 30-DEC-83 30-DEC-83 30-DEC-83 30-MAR-84 27-APR-84 25-MAY-84 29-JUN-84 29-JUN-84 29-JUN-84 27-JUL-84 31-AUG-84

14 rows selected.

47

5.6

Respostas dos exercciosa)SQL> SELECT ENAME, 2 TO_CHAR(HIREDATE,'fmMonth, Ddspth YYYY') DATA_DE_ADMISSAO 3 FROM EMP 4 WHERE DEPTNO = 20 b)SQL> SELECT ENAME, HIREDATE, ADD_MONTHS(HIREDATE,12) REVISAO 2 FROM EMP 3 ORDER BY ADD_MONTHS(HIREDATE,12) c)SQL> SELECT ENAME, 2 DECODE(SIGN(1500-SAL),1,'ABAIXO DE 1500',0,'NO LIMITE',SAL) 3 SALARIO 4 FROM EMP 5 ORDER BY ENAME d)SQL> SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DIA 2 FROM SYS.DUAL Enter value for anydate: 12.11.88 old 1: SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DIA new 1: SELECT TO_CHAR(TO_DATE('12.11.88','DD.MM.YY'),'DAY') DIA e)SQL> DEFINE TIME = MONTHS_BETWEEN(SYSDATE,HIREDATE) SQL> SELECT ENAME, FLOOR(&TIME/12)||' ANOS '|| 2 FLOOR(MOD(&TIME,12))||' MESES ' "TEMPO DE SERVICO" 3 FROM EMP 4 WHERE ENAME = UPPER('&NOME_DO_EMPREGADO') old 1: SELECT ENAME, FLOOR(&TIME/12)||' ANOS '|| new 1: SELECT ENAME, FLOOR(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)||' ANOS '|| old 2: FLOOR(MOD(&TIME,12))||' MESES ' "TEMPO DE SERVICO" new 2: FLOOR(MOD(MONTHS_BETWEEN(SYSDATE,HIREDATE),12))||' MESES ' "TEMPO DE SERVICO" Enter value for nome_do_empregado: king old 4: WHERE ENAME = UPPER('&NOME_DO_EMPREGADO') new 4: WHERE ENAME = UPPER('king') f)SQL> SELECT '12/34' VALOR, 2 DECODE(TRANSLATE('12/34','1234567890','9999999999'), 3 '99/99','SIM','NAO') "VALIDO?" 4 FROM SYS.DUAL g)SQL> SELECT ENAME, HIREDATE, 2 DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-15), 3 1,NEXT_DAY(LAST_DAY(ADD_MONTHS(HIREDATE,1)),'FRIDAY')-7, 4 NEXT_DAY(LAST_DAY(HIREDATE),'FRIDAY')-7) DIA_DO_PAGAMENTO 5 FROM EMP 6 ORDER BY HIREDATE ou SQL> 2 3 4 5 SELECT ENAME, HIREDATE, NEXT_DAY(LAST_DAY(ROUND(HIREDATE,'MONTH'))-7,'FRIDAY') DIA_DO_PAGAMENTO FROM EMP ORDER BY HIREDATE

48

Capitulo 6: Funes de Grupo6.1 Objetivos deste captulo Este captulo explica como informaes sumarizadas (mdia, mximo, mnimo,...) podem ser obtidas para grupo de linhas. As funes vistas anteriormente operavam sobre cada linha, enquanto que as funes mostradas neste captulo operam sobre um grupo de linhas. 6.2 Funes disponveis Funo 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) Valor retornado Valor mdio de 'n', ignorando os valores nulos. Nmero de ocorrncias no nulas da expresso. O '*' obriga a contagem total, incluindo valores duplicados e nulos. Valor mximo da expresso. Valor mnimo da expresso. Desvio padro de 'n', ignorando os valores nulos. Soma dos valores de 'n', ignorando os valores nulos. Varincia 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. Podem ser fornecidas expresses dos tipos caracter, nmero ou data quando 'exp' estiver indicado. Quando 'n' estiver indicado, somente valores numricos so aceitos. 6.3 Usando funes de grupo Para 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. 49

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

6.4

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

6.5

Excluindo linhas dos grupos A 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> 2 3 4 SELECT JOB, AVG(SAL) FROM EMP WHERE JOB != 'MANAGER' GROUP BY JOB

JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5

50

PRESIDENT SALESMAN

5000 1400

6.6

Grupos dentro de grupos Os 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 ----------------10 10 10 20 20 20 30 30 30 9 rows selected. JOB AVG(SAL) --------- ----------------CLERK 1300 MANAGER 2450 PRESIDENT 5000 ANALYST 3000 CLERK 950 MANAGER 2975 CLERK 950 MANAGER 2850 SALESMAN 1400

6.7

Funes de grupo e resultados individuais A 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) ----------------3000 1300 2975 5000 1600 JOB --------ANALYST CLERK MANAGER PRESIDENT 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. 51

O exemplo abaixo mostra o erro causado pela utilizao da funo de grupo MIN(SAL), sem haver a clusula GROUP BY em DEPTNO: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. 6.8 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> 2 3 4 SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 DEPTNO AVG(SAL) ----------------- ----------------20 2175 30 1566.666666666667

Para mostrar os cargos com salrio mximo acima de 3000:SQL> 2 3 4 SELECT JOB, MAX(SAL) FROM EMP HAVING MAX(SAL) >= 3000 GROUP BY JOB

JOB MAX(SAL) --------- ----------------ANALYST 3000 PRESIDENT 5000

52

Embora a clusula HAVING possa ser escrita antes da clusula GROUP BY, a leitura tornase 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> 2 3 4 SELECT DEPTNO, AVG(SAL) FROM EMP WHERE AVG(SAL) > 2000 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> 2 3 4 SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO 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. 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> 2 3 4 5 SELECT JOB, AVG(SAL) FROM EMP WHERE JOB 'MANAGER' GROUP BY JOB HAVING AVG(SAL) > 2000

JOB AVG(SAL) --------- ----------------ANALYST 3000 CLERK 1037.5 PRESIDENT 5000

6.9

Ordem das clusulas SELECT FROM WHERE GROUP BY lista_de_colunas lista_de_tabelas condies_de_linha lista_de_colunas 53

HAVING condies_de_grupo ORDER BY lista_de_colunas

So avaliados: WHERE para ficar somente as linhas que atendem a clusula GROUP BY para montagem dos grupos HAVING para ficar somente os grupos que atendem a clusula 6.10 Exerccios a) Encontrar o menor salrio entre todos os empregados.MENOR ----------------800

b) Encontrar o salrio maior, menor, e mdio, entre todos os empregados.MAX(SAL) MIN(SAL) AVG(SAL) ----------------- ----------------- ----------------5000 800 2073.214285714286

c) Listar o maior e o menor salrio por cada tipo de cargo.CARGO MAIOR MENOR --------- ----------------- ----------------ANALYST 3000 3000 CLERK 1300 800 MANAGER 2975 2450 PRESIDENT 5000 5000 SALESMAN 1600 1250

d) Calcular o nmero de gerentes sem listar seus nomes.GERENTES ----------------3

e) Encontrar o salrio mdio e a remunerao total mdia de cada tipo de cargo, lembrandose que os vendedores recebem comisso.JOB SALARIO_MEDIO REMUNERACAO_MEDIA --------- ----------------- ----------------ANALYST 3000 36000 CLERK 1037.5 12450 MANAGER 2758.333333333333 33100 PRESIDENT 5000 60000 SALESMAN 1400 17237

f) Encontrar a diferena entre o maior e o menor salrios.DIFERENCA ----------------4200

g) Listar todos os departamentos que possuem mais de trs empregados. 54

DEPTNO COUNT(*) ----------------- ----------------20 5 30 6

h) Verificar se no h duplicidade no nmero dos empregadosno rows selected

i) Listar os empregados que recebem o menor salrio em cada departamento, relacionando os seus gerentes. Excluir os grupos onde o menor salrio inferior a 1000. Ordenar os resultados pelo salrioMGR MIN(SAL) ----------------- ----------------7788 1100 7782 1300 7839 2450 7566 3000 5000

55

6.11

Respostas dos exercciosa) SQL> SELECT MIN(SAL) MENOR 2 FROM EMP b) SQL> SELECT MAX(SAL), MIN(SAL), AVG(SAL) 2 FROM EMP c) SQL> SELECT JOB CARGO, MAX(SAL) MAIOR, MIN(SAL) MENOR 2 FROM EMP 3 GROUP BY JOB d) SQL> SELECT COUNT(*) GERENTES 2 FROM EMP 3 WHERE JOB = 'MANAGER' e) SQL> 2 3 4 SELECT JOB, AVG(SAL) SALARIO_MEDIO, AVG(SAL*12+NVL(COMM,0)) REMUNERACAO_MEDIA FROM EMP GROUP BY JOB

f) SQL> SELECT MAX(SAL)-MIN(SAL) DIFERENCA 2 FROM EMP g) SQL> 2 3 4 h) SQL> 2 3 4 i) SQL> 2 3 4 5 SELECT DEPTNO, COUNT(*) FROM EMP GROUP BY DEPTNO HAVING COUNT(*) > 3 SELECT EMPNO FROM EMP GROUP BY EMPNO HAVING COUNT(*) > 1 SELECT MGR, MIN(SAL) FROM EMP GROUP BY MGR HAVING MIN(SAL) >= 1000 ORDER BY MIN(SAL)

56

Captulo 7: Extraindo dados de mais de uma tabela7.1 Objetivos deste captulo Mostrar como obter informaes de mais de uma tabela atravs das junes. Linhas de uma tabela podem ser juntadas com linhas de outra tabela, de acordo com valores comuns existentes em colunas correspondentes. Os dois principais tipos de juno so: 1-Junes equivalentes (equi-join) 2-Junes no equivalentes (non-equi-join) 7.2 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. 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 ---------CLARK KING MILLER SMITH ADAMS FORD SCOTT JONES ALLEN BLAKE MARTIN JAMES TURNER WARD JOB --------MANAGER PRESIDENT CLERK CLERK CLERK ANALYST ANALYST MANAGER SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES 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 3 WHERE EMP.DEPTNO = DEPT.DEPTNO

57

4 ORDER BY DEPT.DEPTNO DEPTNO ENAME JOB ------- ---------- --------10 CLARK MANAGER 10 KING PRESIDENT 10 MILLER CLERK 20 SMITH CLERK 20 ADAMS CLERK 20 FORD ANALYST 20 SCOTT ANALYST 20 JONES MANAGER 30 ALLEN SALESMAN 30 BLAKE MANAGER 30 MARTIN SALESMAN 30 JAMES CLERK 30 TURNER SALESMAN 30 WARD SALESMAN 14 rows selected.

DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

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> 2 3 4 SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO 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.

7.3

Produto Quando a condio de juno invlida ou omitida completamente, o resultado um Produto Cartesiano, e todas as combinaes de linha sero retornadas. O Produto tende a gerar um grande nmero de linhas, e o resultado raramente til.

7.4

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

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

7.5

Regra para juno de tabelas O nmero mnimo de condies de juno igual ao nmero de tabelas menos um.

7.6

Sumrio da Sintaxe

SELECT FROM WHERE AND OR GROUP BY HAVING ORDER BY 7.7 Exerccios

[DISTINCT] {[tabela].*|expresso [alis],...} tabela [alias],... [condio de juno]... [condio de linha]... [outra condio de linha] {expresso|coluna} {condio de grupo} {expresso|coluna} [ASC|DESC]

a) Mostrar o nome dos empregados e dos departamentos onde trabalham, ordenados pelo nome do departamento.ENAME ---------CLARK KING MILLER SMITH ADAMS FORD SCOTT JONES ALLEN BLAKE MARTIN JAMES TURNER DNAME -------------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES

59

WARD

SALES

14 rows selected.

b) Mostrar os nomes dos empregados, juntamente com os nmeros e nomes dos departamentos onde trabalhamENAME 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.

c) Listar o nome, o local de trabalho e o departamento dos empregados com salrio superior a 1500.ENAME ---------CLARK KING JONES SCOTT FORD ALLEN BLAKE LOCAL ------------NEW YORK NEW YORK DALLAS DALLAS DALLAS CHICAGO CHICAGO DNAME -------------ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH SALES SALES

7 rows selected.

d) Listar as faixas salariais dos empregados.ENAME ---------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING JOB SAL GRADE --------- ------- ------CLERK 800 1 CLERK 1100 1 CLERK 950 1 SALESMAN 1250 2 SALESMAN 1250 2 CLERK 1300 2 SALESMAN 1600 3 SALESMAN 1500 3 MANAGER 2975 4 MANAGER 2850 4 MANAGER 2450 4 ANALYST 3000 4 ANALYST 3000 4 PRESIDENT 5000 5

14 rows selected.

60

e) Mostrar somente os empregados na faixa 3.ENAME ---------ALLEN TURNER JOB SAL GRADE --------- ------- ------SALESMAN 1600 3 SALESMAN 1500 3

f) Listar todos os empregados em Dallas.ENAME SAL LOCAL ---------- ------- ------------SMITH 800 DALLAS ADAMS 1100 DALLAS FORD 3000 DALLAS SCOTT 3000 DALLAS JONES 2975 DALLAS

g) Listar os nomes dos empregados, o cargo, o salrio, a faixa salarial, e o nome do departamento para todos na companhia, exceto os Clerks. Ordenar pelo salrio, com os maiores primeiro.ENAME ---------KING FORD SCOTT JONES BLAKE CLARK ALLEN TURNER MARTIN WARD JOB SAL GRADE DNAME --------- ------- ------- -------------PRESIDENT 5000 5 ACCOUNTING ANALYST 3000 4 RESEARCH ANALYST 3000 4 RESEARCH MANAGER 2975 4 RESEARCH MANAGER 2850 4 SALES MANAGER 2450 4 ACCOUNTING SALESMAN 1600 3 SALES SALESMAN 1500 3 SALES SALESMAN 1250 2 SALES SALESMAN 1250 2 SALES

10 rows selected.

h) Listar os seguintes detalhes para os empregados que ganham 36.000 por ano ou que so Clerks.ENAME ---------MILLER SMITH ADAMS JAMES JOB SALARIO_ANUAL DEPTNO DNAME GRADE --------- ------------- ------- -------------- ------CLERK 15600 10 ACCOUNTING 2 CLERK 9600 20 RESEARCH 1 CLERK 13200 20 RESEARCH 1 CLERK 11400 30 SALES 1

61

7.8

Soluo dos exercciosa) SQL> SELECT ENAME, DNAME 2 FROM EMP, DEPT 3 WHERE EMP.DEPTNO = DEPT.DEPTNO b) SQL> SELECT ENAME, E.DEPTNO, DNAME 2 FROM EMP E, DEPT D 3 WHERE E.DEPTNO = D.DEPTNO c) SQL> 2 3 4 SELECT ENAME, LOC LOCAL, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL > 1500

d) SQL> SELECT ENAME, JOB, SAL, GRADE 2 FROM EMP, SALGRADE 3 WHERE SAL BETWEEN LOSAL AND HISAL e) SQL> SELECT ENAME, JOB, SAL, GRADE 2 FROM EMP, SALGRADE 3 WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 3 f) SQL> 2 3 4 g) SQL> 2 3 4 5 6 h) SQL> 2 3 4 5 6 7 SELECT ENAME, SAL, LOC LOCAL FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND LOC='DALLAS' SELECT ENAME, JOB, SAL, GRADE, DNAME FROM EMP, SALGRADE, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND JOB != 'CLERK' ORDER BY SAL DESC SELECT ENAME, JOB, SAL*12+NVL(COMM,0) SALARIO_ANUAL, D.DEPTNO, DNAME, GRADE FROM EMP E, SALGRADE, DEPT D WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND (SAL*12+NVL(COMM,0)=3600 OR JOB = 'CLERK') ORDER BY E.JOB

62

Captulo 8: Outros mtodos de juno8.1 Objetivos deste captulo Mostrar mtodos alternativos para construo de junes. 8.2 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> 2 3 4 SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO (+) = D.DEPTNO 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. 8.3 Juno de uma tabela com ela mesmo possvel utilizar rtulos nas tabelas (aliases) para fazer a juno de uma tabela com ela mesmo, como se fossem duas tabelas distintas. 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

63

4 WHERE E.MGR = EMP_NOME EMP_SAL ---------- ------ALLEN 1600 WARD 1250 JAMES 950 TURNER 1500 MARTIN 1250 MILLER 1300 ADAMS 1100 JONES 2975 CLARK 2450 BLAKE 2850 SMITH 800 11 rows selected.

G.EMPNO AND E.SAL < G.SAL GER_NOME GER_SAL ---------- ------BLAKE 2850 BLAKE 2850 BLAKE 2850 BLAKE 2850 BLAKE 2850 CLARK 2450 SCOTT 3000 KING 5000 KING 5000 KING 5000 FORD 3000

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. 8.4 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. 8.4.1 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> 2 3 4 5 6 7 SELECT JOB FROM EMP WHERE DEPTNO = 10 UNION SELECT JOB FROM EMP WHERE DEPTNO = 30

JOB --------CLERK MANAGER PRESIDENT SALESMAN

8.4.2 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> 2 3 4 5 6 7 SELECT JOB FROM EMP WHERE DEPTNO = 10 INTERSECT SELECT JOB FROM EMP WHERE DEPTNO = 30

64

JOB --------CLERK MANAGER

8.4.3 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> 2 3 4 5 6 7 SELECT JOB FROM EMP WHERE DEPTNO = 10 MINUS SELECT JOB FROM EMP WHERE DEPTNO = 30

JOB --------PRESIDENT

8.4.4 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. 8.4.5 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> 2 3 4 5 6 SELECT EMPNO, ENAME, SAL FROM EMP UNION SELECT ID, NAME, SALARY FROM EMP HISTORY ORDER BY 2

A clusula ORDER BY deve ser sempre a ltima. 8.4.6 Regras para utilizar junes verticais

As declaraes SELECT devem ter todas o mesmo nmero de colunas. Os tipos de dados das colunas correspondentes devem ser idnticos. Linhas duplicadas so automaticamente eliminadas (DISTINCT no pode ser usado). Os nomes das colunas da primeira consulta so os que aparecem no resultado. 65

A clusula ORDER BY deve ser sempre a ltima. A clusula ORDER BY s pode conter os nmeros das colunas, no os nomes. Junes verticais podem ser usadas em sub-consultas. Declaraes SELECT so executadas de cima para baixo. Mltiplas junes verticais podem ser utilizadas, com parnteses, se necessrio, para alterar a ordem de execuo.

8.5

Exerccios a) Listar os departamentos que no possuem empregados.DEPTNO DNAME ------- -------------40 OPERATIONS

b) Listar os nmeros e os nomes dos empregados juntamente com os nmeros e os nomes de seus gerentes.EMPNO ------7788 7902 7499 7521 7900 7844 7654 7934 7876 7566 7782 7698 7369 ENAME GER_NUM GER_NOME ---------- ------- ---------SCOTT 7566 JONES FORD 7566 JONES ALLEN 7698 BLAKE WARD 7698 BLAKE JAMES 7698 BLAKE TURNER 7698 BLAKE MARTIN 7698 BLAKE MILLER 7782 CLARK ADAMS 7788 SCOTT JONES 7839 KING CLARK 7839 KING BLAKE 7839 KING SMITH 7902 FORD

13 rows selected.

c) Alterar a soluo do exerccio b para mostrar KING que no possui gerente.EMPNO ------7788 7902 7499 7521 7900 7844 7654 7934 7876 7566 7782 7698 7369 7839 ENAME GER_NUM GER_NOME ---------- ------- ---------SCOTT 7566 JONES FORD 7566 JONES ALLEN 7698 BLAKE WARD 7698 BLAKE JAMES 7698 BLAKE TURNER 7698 BLAKE MARTIN 7698 BLAKE MILLER 7782 CLARK ADAMS 7788 SCOTT JONES 7839 KING CLARK 7839 KING BLAKE 7839 KING SMITH 7902 FORD KING

66

14 rows selected.

d) Mostrar os cargos que foram preenchidos no primeiro semestre de 1983 e no mesmo perodo em 1984.JOB --------CLERK

e) Listar todos os empregados admitidos antes de seus gerentes.EMPREGADO ---------ALLEN WARD TURNER MARTIN MILLER JONES CLARK BLAKE SMITH HIREDATE --------15-AUG-83 26-MAR-84 04-JUN-84 05-DEC-83 21-NOV-83 31-OCT-83 14-MAY-84 11-JUN-84 13-JUN-83 GERENTE ---------BLAKE BLAKE BLAKE BLAKE CLARK KING KING KING FORD HIREDATE --------11-JUN-84 11-JUN-84 11-JUN-84 11-JUN-84 14-MAY-84 09-JUL-84 09-JUL-84 09-JUL-84 05-DEC-83

9 rows selected.

f) Encontrar outra maneira de resolver o exerccio a.DEPTNO DNAME ------- -------------40 OPERATIONS

67

8.6

Respostas dos exercciosa) SQL> 2 3 4 b) SQL> 2 3 4 c) SQL> 2 3 4 d) SQL> 2 3 4 5 6 7 e) SQL> 2 3 4 f) SQL> 2 3 4 5 6 SELECT D.DEPTNO, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO (+) = D.DEPTNO AND E.EMPNO IS NULL SELECT EMPS.EMPNO, EMPS.ENAME, GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME FROM EMP EMPS, EMP GERS WHERE EMPS.MGR = GERS.EMPNO SELECT EMPS.EMPNO, EMPS.ENAME, GERS.EMPNO GER_NUM, GERS.ENAME GER_NOME FROM EMP EMPS, EMP GERS WHERE EMPS.MGR = GERS.EMPNO (+) SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83' INTERSECT SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84' SELECT E.ENAME EMPREGADO, E.HIREDATE, M.ENAME GERENTE, M.HIREDATE FROM EMP E, EMP M WHERE E.MGR = M.EMPNO AND E.HIREDATE < M.HIREDATE SELECT DEPTNO, DNAME FROM DEPT MINUS SELECT EMP.DEPTNO, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO

68

Captulo 9: Consultas aninhadas9.1 Objetivos deste captulo Mostrar consultas declaradas nas clusulas Where e Having. 9.2 Definio de consultas aninhadas Uma consulta aninhada, ou subconsulta, aquela que est contida dentro de uma outra consulta, e que retorna valores intermedirios. Por exemplo: SELECT FROM WHERE 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. 9.3 Consultas internas que retornam apenas um valor Para encontrar o empregado com o menor salrio da empresa so necessrias duas etapas: a) achar qual o menor salrioSQL> SELECT MIN(SAL) 2 FROM EMP MIN(SAL) -------800

b) localizar o empregado que recebe o menor salrioSELECT ENAME, JOB, SAL FROM EMP WHERE SAL = salrio encontrado na etapa anterior

Os dois comandos podem ser combinados em uma consulta aninhada: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 =, , =, .

69

9.4

Como as consultas aninhadas so executadas Uma declarao SELECT pode ser considerada como um bloco de consulta. No exemplo anterior, haviam dois blocos de consulta: um principal e outro interno. O bloco interno executado primeiro, produzindo o resultado: 800. Em seguida o bloco principal executado, utilizando o valor retornado pelo bloco interno. Para listar todos os empregados com o mesmo cargo do BLAKE:SQL> SELECT ENAME, JOB 2 FROM EMP 3 WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'BLAKE') ENAME ---------JONES BLAKE CLARK JOB --------MANAGER MANAGER MANAGER

O cargo de BLAKE obtido pela consulta interna e utilizado pela consulta principal. 9.5 Consultas internas que retornam mais de um valor A consulta abaixo tenta localizar os empregados com o menor salrio em cada departamento.SQL> SELECT ENAME, SAL, DEPTNO 2 FROM EMP 3 WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO) ENAME SAL DEPTNO ---------- ------- ------SMITH 800 20 JAMES 950 30 MILLER 1300 10

Note que a consulta interna tem uma clusula GROUP BY, e portanto r