Você está na página 1de 42

BANCO DE DADOS 1

LINGUAGEM SQL - STRUCTURED QUERY LANGUAGE

Prof.: Elvis Bloemer Meurer

ORLEANS, 2010

1
CAPÍTULO 1: LINGUAGEM DE DEFINIÇÃO DE DADOS......................................................................................4
1.1 OBJETIVOS DESTE CAPÍTULO ..................................................................................................................................4
1.2 ESTRUTURA DE DADOS DO ORACLE ......................................................................................................................4
1.3 CRIANDO UMA TABELA ..........................................................................................................................................4
1.4 RECOMENDAÇÕES SOBRE OS NOMES DAS TABELAS ...............................................................................................5
1.5 TIPO DE DADO DAS COLUNAS .................................................................................................................................5
1.6 O UTILITÁRIO SQL*PLUS .....................................................................................................................................6
1.7 CRIAÇÃO DE TABELAS............................................................................................................................................6
1.7.1 Sintaxe do comando: .............................................................................................................................................6
1.7.2 Criação das tabelas: .............................................................................................................................................7
1.7.3 Apagando as tabelas:............................................................................................................................................7
1.7.4 Exemplos de restrições..........................................................................................................................................7
1.8 CRIANDO UMA TABELA A PARTIR DE OUTRA TABELA .............................................................................................9
1.9 ALTERANDO UMA TABELA ...................................................................................................................................10
1.10 TROCANDO O NOME DA TABELA E COLUNA..........................................................................................................10
1.11 DESCRIÇÃO DAS TABELAS E COLUNAS .................................................................................................................10
1.12 EXERCÍCIOS .........................................................................................................................................................11
CAPÍTULO 2: INTRODUÇÃO ÀS CONSULTAS......................................................................................................13
2.1 OBJETIVOS DESTE CAPÍTULO ................................................................................................................................13
2.2 RESUMO DO COMANDO SELECT ........................................................................................................................13
2.3 CONSTRUÇÃO BÁSICA DE UMA CONSULTA ...........................................................................................................13
2.4 EXPRESSÕES ARITMÉTICAS ..................................................................................................................................13
2.5 NOMES ALTERNATIVOS PARA TÍTULOS DE COLUNAS ............................................................................................14
2.6 O OPERADOR DE CONCATENAÇÃO .......................................................................................................................14
2.7 MANUSEIO DE VALORES NULOS ...........................................................................................................................15
2.8 ELIMINAÇÃO DE LINHAS DUPLICADAS ..................................................................................................................15
2.9 ORDENAÇÃO DAS LINHAS ....................................................................................................................................16
2.10 CRITÉRIOS DE PESQUISA.......................................................................................................................................16
2.11 CONSULTAS COM CONDIÇÕES MÚLTIPLAS ............................................................................................................19
2.12 PRECEDÊNCIA DOS OPERADORES .........................................................................................................................20
2.13 EXERCÍCIOS .........................................................................................................................................................20
CAPÍTULO 3: LINGUAGEM DE MANIPULAÇÃO DE DADOS............................................................................22
3.1 OBJETIVOS DESTE CAPÍTULO ................................................................................................................................22
3.2 INSERINDO NOVAS LINHAS EM UMA TABELA ........................................................................................................22
3.3 ATUALIZANDO LINHAS EM UMA TABELA ..............................................................................................................24
3.4 ELIMINANDO LINHAS DE UMA TABELA .................................................................................................................25
3.5 EXERCÍCIOS .........................................................................................................................................................25
CAPÍTULO 4: FUNÇÕES NUMÉRICAS E DE CARACTERES..............................................................................27
4.1 OBJETIVOS DESTE CAPÍTULO ................................................................................................................................27
4.2 FUNÇÕES QUE MANIPULAM CARACTERES ............................................................................................................27
4.2.1 LOWER(coluna | literal) ................................................................................................................................27
4.2.2 UPPER(coluna | literal).................................................................................................................................27
4.2.3 INITCAP(coluna | literal) ..............................................................................................................................27
4.2.4 LPAD(coluna | literal, tamanho, 'caracter') ..................................................................................................27
4.2.5 RPAD(coluna | literal, tamanho, 'caracter')..................................................................................................27
4.2.6 SUBSTR(coluna | literal, posição, comprimento)..........................................................................................28
4.2.7 INSTR(coluna | literal, ‘seqüência de caracteres') ........................................................................................28
4.2.8 LTRIM(coluna | literal, 'caracteres') .............................................................................................................28
4.2.9 RTRIM(coluna | literal, 'caracteres') .............................................................................................................28
4.2.10 LENGTH(coluna | literal) .........................................................................................................................28
2
4.2.11 TRANSLATE(coluna | literal, de, para) ....................................................................................................29
4.2.12 REPLACE(coluna | literal, de, para) ........................................................................................................29
4.2.13 Funções aninhadas ...................................................................................................................................29
4.3 FUNÇÕES NUMÉRICAS ..........................................................................................................................................29
4.3.1 ROUND(coluna | literal, n)............................................................................................................................29
4.3.2 TRUNC(coluna | literal, n) ............................................................................................................................30
4.3.3 CEIL(coluna | literal).....................................................................................................................................30
4.3.4 FLOOR(coluna | literal) ................................................................................................................................30
4.3.5 POWER(coluna | literal, n)............................................................................................................................30
4.3.6 EXP(coluna | literal)......................................................................................................................................30
4.3.7 LOG(base, coluna | literal) ............................................................................................................................31
4.3.8 LN(coluna | literal) ........................................................................................................................................31
4.3.9 SQRT(coluna | literal)....................................................................................................................................31
4.3.10 SIGN(coluna | literal)................................................................................................................................31
4.3.11 ABS(coluna | literal)..................................................................................................................................31
4.3.12 MOD(valor1, valor2) ................................................................................................................................31
4.3.13 Funções trigonométricas...........................................................................................................................32
4.3.14 Funções hiperbólicas ................................................................................................................................32
4.4 EXERCÍCIOS .........................................................................................................................................................32
CAPÍTULO 5: FUNÇÕES DE DATA E DE CONVERSÃO ......................................................................................34
5.1 OBJETIVOS DESTE CAPÍTULO ................................................................................................................................34
5.2 FUNÇÕES QUE MANIPULAM DATAS ......................................................................................................................34
5.2.1 SYSDATE .......................................................................................................................................................34
5.2.2 Aritmética de datas ........................................................................................................................................34
5.2.3 MONTHS_BETWEEN(data1,data2) ..............................................................................................................34
5.2.4 ADD_MONTHS(data, meses) ........................................................................................................................34
5.2.5 NEXT_DAY(data, dia_da_semana) ...............................................................................................................35
5.2.6 LAST_DAY(data) ...........................................................................................................................................35
5.2.7 ROUND(data) ................................................................................................................................................35
5.2.8 TRUNC(data) .................................................................................................................................................35
5.3 FUNÇÕES DE CONVERSÃO ....................................................................................................................................36
5.3.1 Formatos de Data ..........................................................................................................................................36
5.3.2 TO_CHAR(número|data,['formato']) ............................................................................................................37
5.3.3 Formatos Numéricos......................................................................................................................................37
5.3.4 TO_NUMBER(cadeia_de_caracteres)...........................................................................................................37
5.3.5 TO_DATE('cadeia_de_caracteres','formato')................................................................................................37
5.4 FUNÇÕES QUE ACEITAM QUALQUER TIPO DE DADO ..............................................................................................38
5.4.1 DECODE(coluna|expressão,pes1,res1,[pes2,res2,...],default) .....................................................................38
5.4.2 NVL(coluna|valor, valor)...............................................................................................................................38
5.4.3 GREATEST(coluna|valor, coluna|valor,...) ...................................................................................................39
5.4.4 LEAST(coluna|valor, coluna|valor,...)...........................................................................................................39
5.4.5 Funções aninhadas revisitadas......................................................................................................................39
5.5 EXERCÍCIOS .........................................................................................................................................................39
APÊNDICE A - TABELAS DO CURSO ......................................................................................................................42

3
Capítulo 1: Linguagem de Definição de Dados
1.1 Objetivos deste capítulo

Apresentar os comandos utilizados para criar, alterar, trocar de nome, adicionar


comentários e remover tabelas.

1.2 Estrutura de Dados do Oracle

Tabelas podem ser criadas a qualquer momento, mesmo com usuários acessando o banco
de dados.

Comprimento dos dados é variável. Somente os caracteres e números especificados são


armazenados. Espaços à frente e à traz não são armazenados.

Não existe a necessidade de se especificar o tamanho das tabelas. As tabelas ocupam


novos segmentos quando necessário.

A estrutura das tabelas podem ser modificadas on-line.

1.3 Criando uma tabela

Devem ser observadas as seguintes regras para o nome de uma tabela:

• O nome deve começar por uma letra, de "A" a "Z", ou de "a" a "z".

• O nome pode conter letras, números, e o caractere especial sublinhado (_). Os


caracteres "$" e "#” também podem ser usado, mas seu uso é desaconselhado.

• O nome é o mesmo, independentemente do uso de letras minúsculas ou maiúsculas.


Por exemplo, EMP, emp. EmP, Emp, e emP são a mesma tabela.

• O nome pode conter até 30 caracteres.

• O nome da tabela não pode ser igual ao de outra tabela, sinônimo ou visão, a não ser
que pertençam a usuários diferentes.

• O nome não pode ser uma das palavras reservadas do Oracle.

Nome Válido
EMP85 Sim
85EMP Não, começa com número.
LUCRO_BRUTO Sim
LUCRO BRUTO Não, contém espaço.
UPDATE Não, palavra reservada.
TABELA1 Sim, mas nome não diz nada.

4
1.4 Recomendações 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.

• Consistência de singular e plural, não 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 começam com FIN_.

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

1.5 Tipo de dado das colunas

Tipo Conteúdo
CHAR(n) Caracteres alfanuméricos com até 'n' caracteres. Coluna de
tamanho constante independente do que está armazenado.
Máximo de 255 caracteres.
VARCHAR(n) Caracteres alfanuméricos com até 'n' caracteres, e pode ter no
máximo 255 caracteres.
VARCHAR2(n) Caracteres alfanuméricos com até 'n’ caracteres, o tamanho
armazenado varia de acordo com o conteúdo da coluna, e pode
ter até 2000 caracteres.
LONG Caracteres alfanuméricos com até 2 GigaBytes (2**31 - 1). Só
pode haver uma coluna LONG por tabela. Não pode ser
indexada. Não podem ser especificadas restrições de integridade,
exceto NOT NULL.
RAW(n) Dados binários, como som e imagem, até 255 bytes. Não podem
ser executadas funções de manipulação de caracteres sobre
colunas RAW. Tem as mesmas restrições de LONG. Não existe
conversão de caracteres, como, por exemplo, ANSI x PC850.
LONG RAW Semelhante a RAW, porém podendo armazenar até 2 GigaBytes.
ROWID Caracteres hexadecimais representando o endereço único de uma
linha em uma tabela.
NUMBER(p,s) Número com a precisão 'p' e a escala 's'. A precisão 'p' pode
variar de 1 a 38. A escala 's' pode variar de -84 a +127
DATE Data válida, desde 1 de janeiro de 4712 AC, até 31 de dezembro
de 4712 DC. Para cada coluna DATA são armazenados o Século,
o Ano, o Mês, o Dia, a Hora, o Minuto e o Segundo.
FLOAT Número de ponto flutuante com precisão decimal de 38 dígitos,
ou precisão binária de 126 dígitos.

5
Dado Especificação Valor armazenado
7456123,89 NUMBER 7456123,89
7456123,89 NUMBER(9) 7456124
7456123,89 NUMBER(9,2) 7456123,89
7456123,89 NUMBER(9,1) 7456123,9
7456123,8 NUMBER(6) precisão excedida
7456123,8 NUMBER(15,1) 7456123,8
7456123,89 NUMBER(7,-2) 7456100
7456123,8 NUMBER(7,2) precisão excedida

1.6 O utilitário SQL*PLUS

O SQL*PLUS é uma interface através da qual os comandos SQL podem ser entrados e
executados. O SQL*PLUS possui outros comandos, que permitem formatar a saída dos
comandos SQL, além de fornecer facilidades para editar e salvar comandos SQL.

Os comandos podem ser escritos em uma ou mais linhas.

1.7 Criação de tabelas

1.7.1 Sintaxe do comando:

CREATE TABLE [esquema.] nome_da_tabela [restrições]


(nome_da_coluna tipo_de_dado (tamanho) [DEFAULT valor] [restrições])

Restrição Descrição
CONSTRAINT Especifica o nome da restrição. É opcional. Quando
nome_da_restrição omitido o nome padrão tem a forma de SYS_Cn, onde 'n' é
um número inteiro atribuído pelo Oracle que identifica
unicamente a restrição.
NULL Especifica se a coluna pode ou não conter valores nulos.
NOT NULL
UNIQUE Designa uma coluna, ou uma combinação de colunas,
como chave única. Cada coluna deve ser declarada como
NOT NULL, e não podem ser chave primária.
PRIMARY KEY Designa uma coluna, ou uma combinação de colunas,
como chave primária. As colunas devem ser declaradas
como NOT NULL e não podem ter a restrição UNIQUE.
Se a chave primária contiver apenas uma coluna pode ser
declarada na restrição da coluna. Se a chave primária
contiver múltiplas colunas deve ser declarada na restrição
da tabela.
FOREIGN KEY Identifica a(s) coluna(s) como chave estrangeira .
(coluna...) REFERENCES identifica a chave primária ou chave única
REFERENCES que é referenciada.
tabela(col(s))

6
CHECK condição Especifica a condição que uma coluna deve satisfazer para
a linha ser aceita na tabela. Só pode se referenciar a colunas
da mesma tabela. Uma restrição de coluna só pode
referenciar a uma coluna, porém uma restrição de tabela
pode referenciar múltiplas colunas.
DISABLE Desativa (ativa) uma restrição de integridade. O padão é a
(ENABLE) restrição ativa.
EXCEPTIONS Identifica a tabela na qual o ORACLE armazena as
INTO informações sobre as linhas que violaram as restrições de
integridade. A tabela deve existir antes desta condição ser
especificada.

1.7.2 Criação das tabelas:

CREATE TABLE DEPARTAMENTO (


CD_DEPARTAMENTO NUMBER(6) NOT NULL,
NM_DEPARTAMENTO VARCHAR2(50),
DS_LOCAL VARCHAR2(20))

CREATE TABLE EMPREGADO (


CD_EMPREGADO NUMBER(6) NOT NULL,
NM_EMPREGADO VARCHAR2(50),
TP_CARGO VARCHAR2(20),
CD_EMPREGADO_GERENTE NUMBER(6),
DT_ADMISSAO DATE,
VL_SALARIO NUMBER(7,2),
VL_COMISSAO NUMBER(7,2),
CD_DEPARTAMENTO NUMBER(6) NOT NULL)

1.7.3 Apagando as tabelas:

DROP TABLE DEPARTAMENTO

1.7.4 Exemplos de restrições

Tabela EMPREGADO atributo VL_SALARIO não permitindo salário nulo.

ALTER TABLE EMPREGADO MODIFY (VL_SALARIO NUMBER(7,2) NOT NULL)

Tabela DEPARTAMENTO com restrições de coluna.


CREATE TABLE DEPARTAMENTO (
CD_DEPARTAMENTO NUMBER(6) CONSTRAINT PK_DEPT PRIMARY KEY,
NM_DEPARTAMENTO VARCHAR2(9) CONSTRAINT UNQ_NM_DEPARTAMENTO
UNIQUE USING INDEX,
DS_LOCAL VARCHAR2(10))

Tabela DEPARTAMENTO com chave primária definida como restrição de tabela.


CREATE TABLE DEPARTAMENTO (
CD_DEPARTAMENTO NUMBER(2) NOT NULL,
NM_DEPARTAMENTO VARCHAR2(9),
DS_LOCAL CHAR(13),
CONSTRAINT PK_DEPT PRIMARY KEY (CD_DEPARTAMENTO)

7
Tabela DEPARTAMENTO com nome do departamento único definido como restrição
de tabela.
CREATE TABLE DEPARTAMENTO (
CD_DEPARTAMENTO NUMBER(2) NOT NULL,
NM_DEPARTAMENTO VARCHAR2(14),
DS_LOCAL VARCHAR2 (13),
CONSTRAINT PK_DEPT PRIMARY KEY (CD_DEPARTAMENTO),
CONSTRAINT UNQ_NM_DEPARTAMENTO UNIQUE (NM_DEPARTAMENTO) USING
INDEX)

Tabela DEPARTAMENTO com opção CHECK.


CREATE TABLE DEPARTAMENTO (
CD_DEPARTAMENTO NUMBER
CONSTRAINT CHECK_CD_DEPARTAMENTO
CHECK (CD_DEPARTAMENTO BETWEEN 10 AND 99)
DISABLE,
NM_DEPARTAMENTO VARCHAR2(14)
CONSTRAINT CHECK_NM_DEPARTAMENTO
CHECK(NM_DEPARTAMENTO=UPPER(NM_DEPARTAMENTO))
DISABLE,
DS_LOCAL VARCHAR2(13)
CONSTRAINT CHECK_LOC
CHECK(DS_LOCAL IN ('DALLAS','BOSTON',...))
DISABLE)

Tabela EMPREGADO com chave estrangeira definida como restrição de coluna.


CREATE TABLE EMPREGADO (
CD_EMPREGADO NUMBER(4) NOT NULL CONSTRAINT PK_EMP PRIMARY KEY,
NM_EMPREGADO VARCHAR2(10),
TP_CARGO VARCHAR2(9),
CD_EMPREGADO_GERENTE NUMBER(4) CONSTRAINT FK_EMP REFERENCES
EMPREGADO(CD_EMPREGADO ),
DT_ADMISSAO DATE,
VL_SALARIO NUMBER(7,2),
VL_COMISSAO NUMBER(7,2),
CD_DEPARTAMENTO NUMBER(2) NOT NULL CONSTRAINT
FK_CD_DEPARTAMENTO REFERENCES DEPARTAMENTO(CD_DEPARTAMENTO))

Tabela EMPREGADO com chave estrangeira definida como restrição de tabela.


CREATE TABLE EMPREGADO (
CD_EMPREGADO NUMBER(4) NOT NULL,
NM_EMPREGADO VARCHAR2(10),
TP_CARGO VARCHAR2(9),
CD_EMPREGADO_GERENTE NUMBER(4),
DT_ADMISSAO DATE,
VL_SALARIO NUMBER(7,2),
VL_COMISSAO NUMBER(7,2),
CD_DEPARTAMENTO NUMBER(2) NOT NULL,
CONSTRAINT PK_EMP PRIMARY KEY (CD_EMPREGADO ),
CONSTRAINT FK_EMP FOREIGN KEY (CD_EMPREGADO_GERENTE) REFERENCES
EMPREGADO(CD_EMPREGADO ),
CONSTRAINT FK_CD_DEPARTAMENTO FOREIGN KEY (CD_DEPARTAMENTO)
REFERENCES DEPARTAMENTO(CD_DEPARTAMENTO))

Tabela EMPREGADO com opção ON DELETE CACADE.


CREATE TABLE EMPREGADO (
CD_EMPREGADO NUMBER(4) NOT NULL,
NM_EMPREGADO VARCHAR2(10),
TP_CARGO VARCHAR2(9),

8
CD_EMPREGADO_GERENTE NUMBER(4),
DT_ADMISSAO DATE,
VL_SALARIO NUMBER(7,2),
VL_COMISSAO NUMBER(7,2),
CD_DEPARTAMENTO NUMBER(2) NOT NULL,
CONSTRAINT PK_EMP PRIMARY KEY (CD_EMPREGADO ),
CONSTRAINT FK_EMP FOREIGN KEY (CD_EMPREGADO_GERENTE) REFERENCES
EMPREGADO(CD_EMPREGADO ),
CONSTRAINT FK_CD_DEPARTAMENTO FOREIGN KEY (CD_DEPARTAMENTO)
REFERENCES DEPARTAMENTO(CD_DEPARTAMENTO) ON DELETE CASCADE)

1.8 Criando uma tabela a partir de outra tabela

É possível criar uma tabela a partir de outra tabela já existente, através do comando:

CREATE TABLE nome_da_tabela

[(especificação das colunas)]

AS SELECT...

Exemplo:

SQL> CREATE TABLE EMP AS SELECT * FROM EMPREGADO

Table created.

O comando DESCRIBE permite visualizar a estrutura das tabelas.


SQL> DESCRIBE EMP
Name Null? Type
------------------------------- -------- ----
CD_EMPREGADO NOT NULL NUMBER(4)
NM_EMPREGADO VARCHAR2(10)
TP_CARGO VARCHAR2(9)
CD_EMPREGADO_GERENTE NUMBER(4)
DT_ADMISSAO DATE
VL_SALARIO NUMBER(7,2)
VL_COMISSAO NUMBER(7,2)
DEPARTAMENTONO NOT NULL NUMBER(2)

SQL> DESCRIBE EMPREGADO


Name Null? Type
------------------------------- -------- ----
CD_EMPREGADO NOT NULL NUMBER(4)
NM_EMPREGADO VARCHAR2(10)
TP_CARGO VARCHAR2(9)
CD_EMPREGADO_GERENTE NUMBER(4)
DT_ADMISSAO DATE
VL_SALARIO NUMBER(7,2)
VL_COMISSAO NUMBER(7,2)
DEPARTAMENTONO NOT NULL NUMBER(2)

As duas tabelas tem exatamente a mesma estrutura e o mesmo conteúdo.

9
1.9 Alterando uma tabela

Para adicionar uma coluna na tabela usamos:

ALTER TABLE nome_da_tabela


ADD ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restrições_de_coluna])
SQL> ALTER TABLE EMPREGADO
2 ADD (NM_ESPOSA VARCHAR2(10))

Table altered.

Para alterar a tabela empregados e garantir todos tenham salário inferior a 5000:

SQL> ALTER TABLE EMPREGADO


2 ADD (CHECK(VL_SALARIO<=5000))

Table altered.

Para modificar uma coluna na tabela usamos:

ALTER TABLE nome_da_tabela


MODIFY ( nome_da_coluna tipo_de_dado [DEFAULT valor] [restrições_de_coluna])

Para modificar a coluna NM_ESPOSA para aceitar até 25 caracteres fazemos:

SQL> ALTER TABLE EMPREGADO


2 MODIFY (NM_ESPOSA VARCHAR2(25))

Table altered.

1.10 Trocando o nome da tabela e coluna

Os nomes dos objetos do banco de dados podem ser trocado através do comando:

RENAME nome_antigo TO nome_novo

Para trocar o nome da tabela de EMPREGADO para FUNCIONARIO:

SQL> RENAME EMPREGADO TO FUNCIONARIO

Alterando nome da atributo da tabela:

ALTER TABLE nome_tabela RENAME COLUMN nome_antigo TO


nome_novo
SQL> ALTER TABLE EMPREGADO RENAME COLUMN VL_SALARIO TO
SALARIO

1.11 Descrição das tabelas e colunas

10
A descrição das tabelas e das colunas pode ser armazenada no dicionário de dados
através do comando COMMENT.

Para adicionar a descrição da tabela FUNCIONARIO:

SQL> COMMENT ON TABLE FUNCIONARIOS IS 'CADASTRO DE FUNCIONARIOS'

COMMENT created.

Para adicionar a descrição da coluna NM_ESPOSA da tabela FUNCIONARIO:

SQL> COMMENT ON COLUMN FUNCIONARIO.NM_ESPOSA IS 'NOME DA ESPOSA DO


FUNCIONARIO'

COMMENT created.

1.12 Exercícios

a) Criar as seguintes tabelas:

Tabela: PROJETO
CD_PROJETO NUMBER 4 NOT NULL
DS_PROJETO VARCHAR2 20
DT_INICIO DATE
DT_FIM DATE
VL_ORCAMENTO NUMBER 7,2
QT_PESSOA NUMBER 2

Tabela: ATRIBUICAO
CD_PROJETO NUMBER 4 NOT NULL
CD_EMPREGADO NUMBER 4 NOT NULL
DT_INICIO DATE
DT_FIM DATE
VL_TAXA NUMBER 4,2
TP_ATRIBUICAO CHAR 2

b) Com as tabelas criadas adicionar a seguinte coluna a tabela ATRIBUICAO:

QT_HORAS NUMBER 2

c) Adicionar comentários às tabelas criadas para descrever o conteúdo.

d) Adicionar comentários à coluna CD_PROJETO da tabela PROJETO descrevendo seu


conteúdo.

e) Mostrar a especificação das colunas das visão USER_COL_COMMENTS.

f) Mostrar os nomes das tabelas, das colunas, e os comentários para as colunas.

11
g) Mostrar a especificação das colunas das visão USER_TAB_COMMENTS.

h) Mostrar os nomes das tabelas e os comentários para as tabelas.

12
Capítulo 2: Introdução às Consultas
2.1 Objetivos deste capítulo

Este capítulo faz uma introdução à linguagem de consulta utilizada para acessar o Banco
de Dados Oracle. Em particular, são discutidas as declarações utilizadas para:

• realizar cálculos

• manusear valores nulos corretamente

• nomes alternativos para títulos das colunas

• concatenar colunas

• ordenar linhas

• fornecer critérios de pesquisa

2.2 Resumo do comando SELECT

SELECT [DISTINCT] {* | coluna [aliás],....}


FROM tabela
WHERE condições
ORDER BY {coluna | expressão} [ASC|DESC]

2.3 Construção básica de uma consulta

O comando SELECT recupera informações do banco de dados, implementando todos os


operadores da álgebra relacional.

Em sua forma mais simples deve incluir:

a. A cláusula SELECT, que lista as colunas a serem envolvidas.

b. A cláusula FROM, que especifica as tabelas envolvidas.

Para listar os números de todos os departamentos, nomes dos empregados e números dos
gerentes da tabela EMPREGADO, digita-se:

SQL> SELECT DEPARTAMENTONO, NM_EMPREGADO , CD_EMPREGADO_GERENTE


2 FROM EMPREGADO

É possível selecionar todas as colunas da tabela colocando-se um "*" (asterisco) após a


palavra SELECT, como visto abaixo:

SQL> SELECT *
2 FROM EMPREGADO

2.4 Expressões aritméticas

13
Uma expressão é a combinação de um ou mais valores, operadores e funções, que
resultam em um valor calculado.

As expressões aritméticas podem conter nomes de colunas, constantes numéricas, e


operadores aritméticos. Os operadores são + - * e / , para soma, subtração, multiplicação
e divisão, respectivamente.

No exemplo abaixo calcula-se o salário anual multiplicando-se o salário mensal por


doze.

SQL> SELECT NM_EMPREGADO , VL_SALARIO*12, VL_COMISSAO


2 FROM EMPREGADO

Se a expressão aritmética contiver mais de um operador, multiplicação e divisão são de


mesma precedência, porém com precedência superior a adição e subtração, que também
são de mesma precedência. No caso de operadores com a mesma precedência, o da
esquerda é processado primeiro.

No exemplo abaixo, a multiplicação (250*12) é realizada primeiro, e depois somada ao


salário.

SQL> SELECT NM_EMPREGADO , VL_SALARIO+250*12


2 FROM EMPREGADO

Parênteses podem ser utilizados para especificar a ordem na qual os operadores serão
executados. Se, por exemplo, for necessário somar 250 ao salário antes de multiplicar
por 12, devemos escrever:

SQL> SELECT NM_EMPREGADO , (VL_SALARIO+250)*12


2 FROM EMPREGADO

2.5 Nomes alternativos para títulos de colunas

O Aliás é especificado escrevendo-se um texto após item a ser mostrado na cláusula


SELECT. Por padrão, o nome do Aliás é convertido para letras maiúsculas, e não pode
conter espaços em branco, a menos que seja colocado entre aspas.

Para mostrar como título da coluna SALARIO ANUAL no lugar de VL_SALARIO*12,


podemos escrever:

SQL> SELECT NM_EMPREGADO NOME, VL_SALARIO*12 “SALARIO ANUAL”,


VL_COMISSAO
2 FROM EMPREGADO

Nota: somente na cláusula SELECT o Aliás pode ser usado, nas outras cláusulas não.

2.6 O operador de concatenação

14
O operador de concatenação (||) permite juntar colunas, expressões aritméticas, ou
valores constantes, para criar uma expressão do tipo caracter. Colunas dos dois lados do
operador são combinadas para formar uma só coluna.

Para combinar o número do empregado com o nome do empregado em uma coluna


apenas, utilizando EMPREGADO como título, devemos escrever:

SQL> SELECT CD_EMPREGADO ||NM_EMPREGADO EMPREGADO


2 FROM EMPREGADO

2.7 Manuseio de valores nulos

Se em uma linha não existir valor para uma determinada coluna, este valor é dito como
sendo nulo.
Um valor nulo é um valor que não está disponível, é desconhecido, ou não é aplicável.
Um valor nulo não é o mesmo que zero. Zero é um número.

Se o valor de qualquer coluna envolvida em uma expressão for nulo, o resultado da


expressão também será nulo. No exemplo abaixo, somente aparecem os salários anuais
dos vendedores, pois somente estes tem comissão não nula.

SQL> SELECT NM_EMPREGADO , VL_SALARIO*12+VL_COMISSAO SALARIO_ANUAL


2 FROM EMPREGADO

Para calcular o resultado corretamente, deve ser utilizada a expressão NVL, que converte
um valor nulo em um valor não nulo, conforme mostrado abaixo:

SQL> SELECT NM_EMPREGADO , VL_SALARIO*12+NVL(VL_COMISSAO, 0)


SALARIO_ANUAL
2 FROM EMPREGADO

A função NVL espera dois argumentos:

a) uma expressão
b) um valor não nulo

Podem ser convertidos valores nulos de data, números, ou caracteres:

NVL(ColunaData, ‘01-jan-84')
NVL(ColunaNumero, 9)
NVL(ColunaCaracter, ‘alfanumérico')

2.8 Eliminação de linhas duplicadas

A não ser que seja especificado o contrário, as linhas duplicadas não são eliminadas dos
resultados das consultas.

SQL> SELECT CD_DEPARTAMENTO


2 FROM EMPREGADO

15
Para eliminar as linhas duplicadas, deve ser incluída a palavra DISTINCT após o
SELECT.

SQL> SELECT DISTINCT CD_DEPARTAMENTO


2 FROM EMPREGADO

Múltiplas colunas podem ser especificadas após a palavra DISTINCT.

SQL> SELECT DISTINCT CD_DEPARTAMENTO, TP_CARGO


2 FROM EMPREGADO

2.9 Ordenação das linhas

Normalmente, a ordem das linhas retornadas por uma consulta é indefinida. A cláusula
ORDER BY pode ser usada para ordenar linhas. Se for usada, ORDER BY deve ser
sempre a última cláusula de um comando SELECT.

Para ordenar pelo nome do empregado, usamos:

SQL> SELECT NM_EMPREGADO , TP_CARGO, VL_SALARIO*12, CD_DEPARTAMENTO


2 FROM EMPREGADO
3 ORDER BY NM_EMPREGADO

Ordem padrão de ordenação:

- Números: menores primeiro


- Data: mais cedo primeiro
- Caracteres: ordem alfabética

Para reverter esta ordem, pode ser utilizada a palavra DESC após o nome da coluna, na
cláusula ORDER BY.

Para listarmos os funcionários mais novos antes dos mais antigos fazemos:

SQL> SELECT NM_EMPREGADO , TP_CARGO, DT_ADMISSAO


2 FROM EMPREGADO
3 ORDER BY DT_ADMISSAO DESC

É possível efetuar a ordenação por mais de uma coluna, sendo algumas em ordem
ascendente e outras em ordem descendente.

SQL> SELECT CD_DEPARTAMENTO, TP_CARGO, NM_EMPREGADO


2 FROM EMPREGADO
3 ORDER BY CD_DEPARTAMENTO, VL_SALARIO DESC

2.10 Critérios de pesquisa

16
Os critérios de pesquisa são informados na cláusula WHERE, que corresponde ao
operador Restrição da álgebra relacional. Nesta cláusula estão estabelecidos os critérios
necessários para uma linha poder ser selecionada.

A cláusula WHERE pode comparar valores em colunas, valores literais, expressões


aritméticas, ou funções. Três elementos são sempre necessários:

- Um nome de coluna
- Um operador de comparação
- Um nome de coluna, constante, ou lista de valores

Existem dois tipos de operadores: lógicos e SQL.

Os operadores lógicos testam as seguintes condições:

= igual
> maior
>= maior ou igual
< menor
<= menor ou igual
<> diferente (^= ou !=)

Para listar os nomes, números, cargos e departamentos de todos os funcionários com


cargo CLERK, usamos:

SQL> SELECT NM_EMPREGADO , CD_EMPREGADO , TP_CARGO, CD_DEPARTAMENTO


2 FROM EMPREGADO
3 WHERE TP_CARGO = ‘BALCONIST’

Para listar o nome e o número dos departamentos com número maior que 20, usamos:

SQL> SELECT NM_DEPARTAMENTO, CD_DEPARTAMENTO


2 FROM DEPARTAMENTO
3 WHERE CD_DEPARTAMENTO > 20

Para sabermos que funcionários tem comissão superior ao salário, usamos:

SQL> SELECT NM_EMPREGADO, VL_SALARIO, VL_COMISSAO


2 FROM EMPREGADO
3 WHERE VL_COMISSAO > VL_SALARIO

Existem quatro operadores SQL, que operam sobre todos os tipos de dados.

BETWEEN...AND... entre dois valores (inclusive)


IN(lista) idênticos a uma lista de valores
LIKE semelhante a um modelo de caracteres
IS NULL valor é nulo

O operador BETWEEN testa valores no intervalo ou idênticos aos limites.

17
SQL> SELECT NM_EMPREGADO , VL_SALARIO
2 FROM EMPREGADO
3 WHERE VL_SALARIO BETWEEN 1000 AND 2000

O operador IN testa os valores especificados em uma lista.

SQL> SELECT CD_EMPREGADO, NM_EMPREGADO, VL_SALARIO,


CD_EMPREGADO_GERENTE
2 FROM EMPREGADO
3 WHERE CD_EMPREGADO_GERENTE IN ( 7902, 7566, 7788 )

Se caracteres ou datas forem utilizados, devem ser envoltos por apóstrofos.

Usando o operador LIKE é possível selecionar linhas de acordo com modelo fornecido.
O símbolo "%" representa qualquer seqüência de zero ou mais caracteres. O símbolo "_"
(sublinhado) representa qualquer um caracter, mas apenas um, no mínimo e no máximo.

Para listarmos todos os empregados cujos nomes começam com a letra "S", usamos:

SQL> SELECT NM_EMPREGADO


2 FROM EMPREGADO
3 WHERE NM_EMPREGADO LIKE 'S%'

Para listar os nomes de todos os empregados que contém exatamente 4 letras, usamos:

SQL> SELECT NM_EMPREGADO


2 FROM EMPREGADO
3 WHERE NM_EMPREGADO LIKE '____' (quatro caracteres de
sublinhado)

O operador IS NULL serve especificamente para testar valores nulos.

Para listar os funcionários que não possuem gerente, usamos:

SQL> SELECT NM_EMPREGADO , CD_EMPREGADO_GERENTE


2 FROM EMPREGADO
3 WHERE CD_EMPREGADO_GERENTE IS NULL

Os operadores mostrados abaixo podem ser utilizados para testes de negação:

!= ^= <> não igual


NOT NomeDaColuna = não igual a
NOT NomeDaColuna > não maior do que
NOT BETWEEN fora da faixa especificada
NOT IN fora da lista especificada
NOT LIKE não semelhante ao modelo
IS NOT NULL não é nulo

Para listar os empregados com salários fora da faixa de 1000 a 2000, usamos:

18
SQL> SELECT NM_EMPREGADO , VL_SALARIO
2 FROM EMPREGADO
3 WHERE VL_SALARIO NOT BETWEEN 1000 AND 2000

Para listar os empregados cujos cargos não começam com a letra M, usamos:

SQL> SELECT NM_EMPREGADO , TP_CARGO


2 FROM EMPREGADO
3 WHERE TP_CARGO NOT LIKE 'M%'

Para listar os empregados com gerentes, usamos:

SQL> SELECT NM_EMPREGADO , CD_EMPREGADO_GERENTE


2 FROM EMPREGADO
3 WHERE CD_EMPREGADO_GERENTE IS NOT NULL

x <> NULL e x = NULL


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

2.11 Consultas com condições múltiplas

Os operadores AND e OR podem ser utilizados para criar expressões lógicas compostas.

O predicado AND espera que todas duas condições sejam verdadeiras.

O predicado OR espera que uma (ou as duas) condições sejam verdadeiras.

Nos exemplos abaixo as condições são as mesmas, porém os predicados são diferentes.

Para listar todos os BALCONISTAs com salário entre 1000 e 2000, usamos:

SQL> SELECT CD_EMPREGADO , NM_EMPREGADO , TP_CARGO, VL_SALARIO


2 FROM EMPREGADO
3 WHERE VL_SALARIO BETWEEN 1000 AND 2000
4 AND TP_CARGO = 'BALCONIST'

Para listar os funcionários que são BALCONIST, ou que recebem entre 1000 e 2000,
usamos:

SQL> SELECT CD_EMPREGADO , NM_EMPREGADO , TP_CARGO, VL_SALARIO


2 FROM EMPREGADO
3 WHERE VL_SALARIO BETWEEN 1000 AND 2000
4 OR TP_CARGO = ‘BALCONIST'

Quando aparecem tanto ANDs quanto ORs em uma expressão lógica, todos os ANDs
são processados antes que os ORs sejam processados.

Uma vez que AND tem precedência sobre OR, a consulta abaixo retorna todos os
gerentes com salário maior do que 1500, e todos os vendedores.

19
SQL> SELECT CD_EMPREGADO , NM_EMPREGADO , TP_CARGO, VL_SALARIO,
CD_DEPARTAMENTO
2 FROM EMPREGADO
3 WHERE VL_SALARIO > 1500
4 AND TP_CARGO = 'GERENTE'
5 OR TP_CARGO = 'VENDEDOR'

Para selecionar todos os vendedores e gerentes com salário superior a 1500, usamos:

SQL> SELECT CD_EMPREGADO , NM_EMPREGADO , TP_CARGO, VL_SALARIO,


CD_DEPARTAMENTO
2 FROM EMPREGADO
3 WHERE VL_SALARIO > 1500
4 AND ( TP_CARGO = 'GERENTE' OR TP_CARGO = 'VENDEDOR' )

Os parênteses especificam a ordem em que os operadores devem ser calculados.

2.12 Precedência dos operadores

a) os operadores de comparação e os operadores SQL tem precedências iguais.

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

b) NOT (para reverter o resultado lógico da expressão, WHERE


NOT(VL_SALARIO>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 EMPREGADO
3 WHERE TP_CARGO = ‘MANAGER'
4 OR (TP_CARGO = ‘CLERK' AND CD_DEPARTAMENTO = 10)

2.13 Exercícios

a) Selecionar todas as informações da tabela DEPARTAMENTO

b) Selecionar todas a informações da tabela EMPREGADO

c) Listar todos os funcionários com salário entre 1000 e 2000

d) Listar os números e os nomes dos departamentos, ordenados pelo nome do


departamento

e) Listar os diferentes tipos de cargo

20
f) Listar os detalhes dos empregados dos departamentos 10 e 20 em ordem alfabética de
nome.

g) Listar os nomes e os cargos de todos os BALCONIST do departamento 20.

h) Listar os nomes de todos os empregados onde aparece TH ou LL no nome.

i) Mostrar o nome e a remuneração total de todos os empregados.

j) Mostrar todos os empregados que foram admitidos em 1983.

k) Mostrar o nome, o salário anual e comissão, de todos os vendedores com salário


mensal maior do que a comissão. O resultado deve ser ordenado com os maiores salários
na frente. Se dois ou mais empregados tiverem o mesmo salário, deve ser ordenado pelo
nome do funcionário.

l) Selecione os dados para reproduzir a saída 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

21
Capítulo 3: Linguagem de Manipulação de Dados
3.1 Objetivos deste capítulo

Mostrar a linguagem de manipulação de dados (DML), utilizada para inserir, atualizar e


eliminar registros do banco de dados.

3.2 Inserindo novas linhas em uma tabela

Para inserir linhas em uma tabela é utilizado o comando INSERT.

INSERT INTO nome_da_tabela [(coluna, coluna, ...)]


VALUES (valor, valor, ...)

Os exemplos serão efetuados sobre a tabela Department criada a partir da tabela


DEPARTAMENTO.

SQL> CREATE TABLE DEPARTMENT


2 AS
3 SELECT *
4 FROM DEPARTAMENTO

Table created.

Quando os novos valores são inseridos em todas as colunas da tabela, na mesma ordem
das colunas da tabela, a lista de colunas pode ser omitida. É recomendado que a lista de
colunas seja sempre especificada, para não haver necessidade de alterar o programa
quando uma nova coluna for adicionada à tabela.

Para inserir um novo departamento.

SQL> INSERT INTO DEPARTMENT ( CD_DEPARTAMENTO, NM_DEPARTAMENTO,


DS_LOCAL )
2 VALUES (50, 'MARKETING', 'SAN JOSE' )

1 row created.

Para inserir apenas o número e a localidade do novo departamento.

SQL> INSERT INTO DEPARTMENT ( CD_DEPARTAMENTO, DS_LOCAL )


2 VALUES ( 60, 'ALBERTA' )

1 row created.

Em vez que omitir o nome do departamento na lista de colunas, pode ser especificado o
valor nulo para o nome do departamento, o resultado é o mesmo.

SQL> INSERT INTO DEPARTMENT ( CD_DEPARTAMENTO, NM_DEPARTAMENTO,


DS_LOCAL )
2 VALUES ( 70, NULL, 'DETROIT' )

1 row created.
Podem ser utilizadas variáveis de substituição para fornecimento dos valores.

22
SQL> INSERT INTO DEPARTMENT ( CD_DEPARTAMENTO, NM_DEPARTAMENTO,
DS_LOCAL )
2 VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' )
Enter value for DEPARTAMENTO_num: 80
Enter value for DEPARTAMENTO_name: INVESTIGAÇÃO
Enter value for DEPARTAMENTO_loc: ATLANTA
old 2: VALUES ( &DEPT_NUM, '&DEPT_NAME', '&DEPT_LOC' )
new 2: VALUES ( 80, ' INVESTIGAÇÃO', 'ATLANTA' )

1 row created.

Para inserir um novo departamento omitindo a lista de colunas.

SQL> INSERT INTO DEPARTMENT


2 VALUES ( 90, 'SEGUROS', 'ORLEANS' )

1 row created.

Listando a tabela de departamentos após as inserções:

SQL> SELECT *
2 FROM DEPARTMENT
3 ORDER BY CD_DEPARTAMENTO

Para os exemplos de inserção de valores de data e hora será criada a tabela


FUNCIONARIO a partir da tabela Emp.

SQL> CREATE TABLE FUNCIONARIO


2 AS
3 SELECT *
4 FROM EMPREGADO

Table created.

Quando uma data é inserida, o formato DD-MON-YY é geralmente usado. Com este
formato, o século padrão é o século 20 (19xx). O campo data também contém
informação de hora, que quando não é especificada assume o valor padrão de zero horas
(00:00:00).

Se for necessário especificar a data em outro século, ou for necessário especificar a hora,
a função TO_DATE é utilizada.

SQL> INSERT INTO FUNCIONARIO


2 ( CD_EMPREGADO, NM_EMPREGADO, TP_CARGO, CD_EMPREGADO_GERENTE,
DT_ADMISSAO, VL_SALARIO, VL_COMISSAO, CD_DEPARTAMENTO )
3 VALUES (
4 7658,
5 'CODD',
6 'ANALISTA',
7 7566,
8 TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'),
9 3000,
10 NULL,
11 20)
1 row created.

Para exemplo de inserção de valores a partir de uma outra tabela será criada a tabela
FUNCIONARIO a partir da tabela EMPREGADO.
23
SQL> CREATE TABLE FUNCIONARIO
2 AS
3 SELECT * FROM EMPREGADO
4 WHERE CD_DEPARTAMENTO=0

Table created.

Como não existe nenhum departamento com número zero na tabela EMPREGADO, não
foi incluída nenhuma linha na tabela FUNCIONARIO durante a criação.

SQL> SELECT *
2 FROM FUNCIONARIO

no rows selected

Para inserir na tabela FUNCIONARIO, a partir da tabela EMPREGADO, os valores


correspondentes à faixa 1.

SQL> INSERT INTO FUNCIONARIO


2 SELECT *
3 FROM EMPREGADO

1 row created.

Para verificar se a inclusão foi feita corretamente.

SQL> SELECT *
2 FROM FUNCIONARIO

3.3 Atualizando linhas em uma tabela

Para atualizar linhas de uma tabela é utilizado o comando UPDATE.

UPDATE nome_da_tabela [aliás]


SET coluna, [,coluna...] = {expressão ou sub-consulta}
[WHERE condição]

Para atualizar as informações do funcionário SCOTT.

SQL> UPDATE FUNCIONARIO


2 SET
3 TP_CARGO = 'VENDEDOR',
4 DT_ADMISSAO = SYSDATE,
5 VL_SALARIO = SAL*1.1
6 WHERE NM_EMPREGADO = 'SCOTT'

1 row updated.

Para trocar todos os cargos de VENDEDOR por vendedor.

SQL> UPDATE FUNCIONARIO


2 SET TP_CARGO = 'VENDEDOR'
3 WHERE TP_CARGO = 'VENDEDOR'

5 rows updated.

24
Para listar a tabela após as atualizações.

SQL> SELECT NM_EMPREGADO , TP_CARGO


2 FROM FUNCIONARIO
3 ORDER BY TP_CARGO, NM_EMPREGADO

3.4 Eliminando linhas de uma tabela

Para eliminar linhas de uma tabela é utilizado o comando DELETE.

DELETE FROM nome_da_tabela


[WHERE condição]

Para eliminar todos os empregados que trabalham no departamento 10.

SQL> DELETE FROM FUNCIONARIO


2 WHERE CD_DEPARTAMENTO = 10

3 rows deleted.

Para eliminar todos os empregados.

SQL> DELETE FROM FUNCIONARIO

12 rows deleted.

Para verificar como ficou a tabela após a eliminação.

SQL> SELECT * FROM FUNCIONARIO

no rows selected
Apesar de não possuir nenhuma linha, a tabela FUNCIONARIO ainda existe, para
eliminá-la é utilizado o comando da linguagem de definição de dados (DDL) DROP
TABLE.

SQL> DROP TABLE FUNCIONARIO

Table dropped.

3.5 Exercícios

a) Inserir as seguintes linhas na tabela PROJETO

CD_PROJETO 1 2
DS_PROJETO WRITE C030 COURSE PROOF READ NOTES
DT_INICIO 02-JAN-88 01-JAN-89
DT_FIM 07-JAN-88 10-JAN-89
VL_ORCAMENTO 500 600
QT_PESSOA 1 1

b) Inserir as seguintes linhas na tabela ATRIBUICAO

25
CD_PROJETO 1 1 2
CD_EMPREGADO 7369 7902 7844
DT_INICIO 01-JAN-88 04-JAN-88 01-JAN-89
DT_FIM 03-JAN-88 07-JAN-88 10-JAN-89
VL_TAXA 50.00 55.00 45.50
TP_ATRIBUICAO WR WR PF
QT_HORAS 15 20 30

c) Alterar as informações TP_ ATRIBUICAO: trocar WR por WT.

d) Alterar QT_HORAS do projeto 1 e empregado 7369 para 23 horas.

e) Deletar as atribuições do projeto 2.

26
Capítulo 4: Funções Numéricas e de Caracteres
4.1 Objetivos deste capítulo

Este capítulo mostra as funções do Oracle que manipulam números e sequências de


caracteres.

4.2 Funções que manipulam caracteres

4.2.1 LOWER(coluna | literal)

Transforma letras maiúsculas em minúsculas.

SQL> SELECT LOWER(NM_DEPARTAMENTO), LOWER('CURSO DE SQL')


2 FROM DEPARTAMENTO

4.2.2 UPPER(coluna | literal)

Transforma letras minúsculas em maiúsculas.

SQL> SELECT NM_EMPREGADO


2 FROM EMPREGADO
3 WHERE NM_EMPREGADO = UPPER('smith')

4.2.3 INITCAP(coluna | literal)

Transforma a primeira letra da palavra em maiúscula e as demais minúsculas.

SQL> SELECT INITCAP(NM_DEPARTAMENTO), INITCAP(DS_LOCAL)


2 FROM DEPARTAMENTO

4.2.4 LPAD(coluna | literal, tamanho, 'caracter')

Preenche a sequência de caracteres, à esquerda, com o caracter e o tamanho informados.


Se o caracter de preenchimento não for informado, será utilizado o caracter de espaço.

No exemplo abaixo, as três colunas são preenchidas à esquerda até um total de 20


caracteres. A primeira coluna foi preenchida com asteriscos, a segunda com espaços, e a
terceira com pontos. Note que a terceira coluna é numérica.

SQL> SELECT LPAD(NM_DEPARTAMENTO, 20, ‘*'), LPAD(NM_DEPARTAMENTO,


20), LPAD(CD_DEPARTAMENTO, 20,'.')
2 FROM DEPARTAMENTO

4.2.5 RPAD(coluna | literal, tamanho, 'caracter')

Preenche a seqüência de caracteres, à direta, com o caracter e o tamanho informados. Se


o caracter de preenchimento não for informado, será utilizado o caracter de espaço.

27
SQL> SELECT RPAD(NM_DEPARTAMENTO, 20, ‘*'), RPAD(NM_DEPARTAMENTO,
20), RPAD(CD_DEPARTAMENTO, 20,'.')
2 FROM DEPARTAMENTO

4.2.6 SUBSTR(coluna | literal, posição, comprimento)

Retorna uma seqüência de caracteres, a partir da posição indicada, com o comprimento


especificado.

SQL> SELECT SUBSTR('ORACLE',2,4), SUBSTR(NM_DEPARTAMENTO,2),


SUBSTR(NM_DEPARTAMENTO,3,5)
2 FROM DEPARTAMENTO

4.2.7 INSTR(coluna | literal, ‘seqüência de caracteres')

Encontra a posição da primeira ocorrência da seqüência de caracteres na coluna ou


literal, se os dois últimos parâmetros forem omitidos.

Encontra a posição da n-ésima ocorrência a partir da posição indicada, se os quatro


parâmetros forem fornecidos.

SQL> SELECT NM_DEPARTAMENTO,


2 INSTR(NM_DEPARTAMENTO,'A'), INSTR(NM_DEPARTAMENTO,'ES')
3 FROM DEPARTAMENTO

4.2.8 LTRIM(coluna | literal, 'caracteres')

Remove os caracteres indicados à esquerda da coluna ou do literal. Se nenhum caracter


for especificado, serão eliminados os espaços à esquerda.

SQL> SELECT NM_DEPARTAMENTO,


2 LTRIM(NM_DEPARTAMENTO,'A'), LTRIM(NM_DEPARTAMENTO,'AS'),
LTRIM(NM_DEPARTAMENTO,'ASOP')
3 FROM DEPARTAMENTO

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, serão eliminados os espaços à direita.

SQL> SELECT NM_DEPARTAMENTO,


2 RTRIM(NM_DEPARTAMENTO,'G'), RTRIM(NM_DEPARTAMENTO,'GHS'),
RTRIM(NM_DEPARTAMENTO,'N')
3 FROM DEPARTAMENTO

4.2.10 LENGTH(coluna | literal)

28
Retorna o número de caracteres (ou dígitos) na coluna ou literal especificados.

SQL> SELECT LENGTH('CURSO DE SQL'), LENGTH(CD_DEPARTAMENTO),


LENGTH(NM_DEPARTAMENTO)
2 FROM DEPARTAMENTO

4.2.11 TRANSLATE(coluna | literal, de, para)

Substitui os caracteres do argumento "de" pelos caracteres do argumento "para", na


coluna ou literal especificados. Todas as ocorrências dos caracteres do parâmetro "de"
são substituídas pelos caracteres no parâmetro "para". Caracteres do parâmetro "de" sem
correspondência no parâmetro "para" são removidos.

No exemplo abaixo foram trocados os caracteres "C" por "P" nos nomes dos
funcionários.

SQL> SELECT NM_EMPREGADO , TRANSLATE(NM_EMPREGADO ,'C','P')


2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 10

4.2.12 REPLACE(coluna | literal, de, para)

Substitui a seqüência de caracteres "de" pela seqüência de caracteres "para", na coluna ou


literal especificados.

No exemplo abaixo VENDEDOR é substituído por VEND:

SQL> SELECT TP_CARGO, REPLACE(TP_CARGO,'VENDEDOR','VEND')


2 FROM EMPREGADO

No exemplo abaixo, "CO" foi substituído por "PX":


SELECT NM_EMPREGADO , REPLACE(NM_EMPREGADO ,'CO','PX')
FROM EMPREGADO

4.2.13 Funções aninhadas

As funções que operam sobre uma única linha podem ser aninhadas, sendo que neste
caso as funções internas são executadas antes das externas.

SQL> SELECT NM_DEPARTAMENTO, LENGTH(NM_DEPARTAMENTO),


2 LENGTH(NM_DEPARTAMENTO)-
LENGTH(TRANSLATE(NM_DEPARTAMENTO,'AS','A'))
3 FROM DEPARTAMENTO

4.3 Funções numéricas

4.3.1 ROUND(coluna | literal, n)

29
Arredonda o valor da coluna ou do literal na n-ésima casa decimal. Se n for negativo
equivale às dezenas. Se n for omitido equivale a um número inteiro.

SQL> SELECT ROUND(45.923,1), ROUND(45.923), ROUND(42.323,-1),


ROUND(VL_SALARIO/32,2)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 10

4.3.2 TRUNC(coluna | literal, n)

Trunca o valor da coluna ou do literal na n-ésima posição.

SQL> SELECT TRUNC(45.923,1), TRUNC(45.923), TRUNC(42.323,-1),


TRUNC(VL_SALARIO/32,2)
2 FROM EMPREGADO
3 WHERE DEPARTAMENTONO = 10

4.3.3 CEIL(coluna | literal)

Retorna o menor inteiro maior ou igual ao valor da coluna ou do literal.

SQL> SELECT CEIL(VL_SALARIO), CEIL(99.9), CEIL(101.76), CEIL(-11.1)


2 FROM EMPREGADO
3 WHERE VL_SALARIO BETWEEN 3000 AND 5000

4.3.4 FLOOR(coluna | literal)

Retorna o maior inteiro menor ou igual ao valor da coluna ou literal.

SQL> SELECT FLOOR(VL_SALARIO), FLOOR(99.9), FLOOR(101.76), FLOOR(-


11.1)
2 FROM EMPREGADO
3 WHERE FLOOR(VL_SALARIO) BETWEEN 3000 AND 5000

4.3.5 POWER(coluna | literal, n)

Eleva a coluna ou literal a n-ésima potência.

SQL> SELECT VL_SALARIO, POWER(VL_SALARIO,2), POWER(VL_SALARIO,3),


POWER(50,5)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 10

4.3.6 EXP(coluna | literal)

Eleva e (2.71828183...) à coluna ou literal.

SELECT EXP(4)
FROM DUAL

30
4.3.7 LOG(base, coluna | literal)

Calcula o logaritmo da coluna ou do literal na base especificada.

SELECT LOG(10,100)
FROM DUAL

4.3.8 LN(coluna | literal)

Calcula o logaritmo neperiano da coluna ou do literal.

SELECT LN(95)
FROM DUAL

4.3.9 SQRT(coluna | literal)

Retorna a raiz quadrada da coluna ou do literal.

SQL> SELECT VL_SALARIO, SQRT(VL_SALARIO), SQRT(40),


SQRT(VL_COMISSAO)
2 FROM EMPREGADO
3 WHERE VL_COMISSAO > 0

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 VL_SALARIO-VL_COMISSAO, SIGN(VL_SALARIO-VL_COMISSAO),


VL_COMISSAO-VL_SALARIO, SIGN(VL_COMISSAO-VL_SALARIO)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 30

Salários maiores do que a comissão podem ser listados conforme mostrado abaixo:

SQL> SELECT NM_EMPREGADO, VL_SALARIO, VL_COMISSAO


2 FROM EMPREGADO
3 WHERE SIGN(VL_SALARIO-VL_COMISSAO) = 1

4.3.11 ABS(coluna | literal)

Retorna o valor absoluto da coluna ou do literal.

SQL> SELECT VL_SALARIO, VL_COMISSAO, VL_COMISSAO-VL_SALARIO,


ABS(VL_COMISSAO-VL_SALARIO)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 30

4.3.12 MOD(valor1, valor2)


31
Retorna o resto da divisão de valor1 por valor2.

SQL> SELECT VL_SALARIO, VL_COMISSAO, MOD(VL_SALARIO,VL_COMISSAO),


MOD(100,40)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 30
4 ORDER BY VL_COMISSAO

4.3.13 Funções trigonométricas

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

4.3.14 Funções hiperbólicas

Calculam o seno hiperbólico (SINH), coseno hiperbólico (COSH) e tangente hiperbólica


(TANH) da coluna ou literal.

SELECT SINH(1), COSH(0), TANH(.5)


FROM DUAL

4.4 Exercícios

a) Listar o número do departamento, o nome do funcionário, e o salário com aumento de


15% expresso em número inteiro.

b) Gerar a listagem da tabela EMPREGADO 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.

32
c) Listar uma lista contendo todos os empregados com um identificador composto pelas
duas primeiras letras de seus cargos e os dois dígitos do meio de seus números de
matrícula.
NOME CODIGO
---------- --------
SMITH CL36
ALLEN SA49
WARD SA52
JONES MA56
MARTIN SA65
BLAKE MA69
CLARK MA78
SCOTT AN78
KING PR83
TURNER SA84
ADAMS CL87
JAMES CL90
FORD AN90
MILLER CL93

e) Imprima os nomes dos departamentos centrados em um campo com largura de 20


posições.
DEPARTAMENTO
--------------------
ACCOUNTING
RESEARCH
SALES
OPERATIONS

f) Encontrar a primeira ocorrência da letra "L" nos nomes dos empregados e substituir
pela letra "X".

33
Capítulo 5: Funções de Data e de Conversão
5.1 Objetivos deste capítulo

Este capítulo mostra as funções do Oracle que manipulam datas e fazem a conversão de
tipo de dados.

5.2 Funções que manipulam datas

5.2.1 SYSDATE

SYSDATE é uma pseudo-coluna que retorna a data e a hora corrente. A tabela


SYS.DUAL é pública, contém 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 expressão. 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 Aritmética de datas

Datas podem ser somadas ou subtraídas de outras datas, ou de valores numéricos.

data+número Soma o número de dias à data, produzindo outra data


data-número Subtrai o número de dias à data, produzindo outra data
data-data Subtrai uma data da outra, produzindo número de dias
data+número/24 Soma número de horas à data, produzindo outra data

SQL> SELECT DT_ADMISSAO, DT_ADMISSAO+7, DT_ADMISSAO-7, SYSDATE-


DT_ADMISSAO
2 FROM EMPREGADO
3 WHERE DT_ADMISSAO LIKE '%JUN%'

A operação SYSDATE-DT_ADMISSAO retorna o número de dias entre a admissão do


empregado e a data atual.

5.2.3 MONTHS_BETWEEN(data1,data2)

Retorna o número de meses decorridos entre data1 e data2.

SQL> SELECT MONTHS_BETWEEN(SYSDATE,DT_ADMISSAO),


2 MONTHS_BETWEEN('01-JAN-84','05-NOV-88')
3 FROM EMPREGADO
4 WHERE MONTHS_BETWEEN(SYSDATE,DT_ADMISSAO) > 59

5.2.4 ADD_MONTHS(data, meses)

34
Adiciona o número de meses especificados à data.

SQL> SELECT DT_ADMISSAO, ADD_MONTHS(DT_ADMISSAO,3),


ADD_MONTHS(DT_ADMISSAO,-3)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO=20

5.2.5 NEXT_DAY(data, dia_da_semana)

Data do próximo dia da semana após data.

SQL> SELECT DT_ADMISSAO, NEXT_DAY(DT_ADMISSAO,'FRIDAY'),


NEXT_DAY(DT_ADMISSAO,6)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 10

5.2.6 LAST_DAY(data)

Retorna a data do último dia do mês da data especificada.

SQL> SELECT SYSDATE, LAST_DAY(SYSDATE), DT_ADMISSAO,


2 LAST_DAY(DT_ADMISSAO), LAST_DAY('15-FEB-88')
3 FROM EMPREGADO
4 WHERE CD_DEPARTAMENTO = 20

5.2.7 ROUND(data)
ROUND(data, 'MONTH')
ROUND(data, 'YEAR')

ROUND(data) retorna a data com a indicação da hora como sendo zero horas (meia
noite). Até o meio dia retorna a mesma data, após o meio dia retorna o dia seguinte. Esta
função é útil quando são comparadas datas com horas diferentes.

ROUND(data, 'MONTH') retorna o primeiro dia do mês da data, se a data estiver na


primeira quinzena, ou retorna o primeiro dia do mês 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

5.2.8 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 mês da data.
35
TRUNC(data,'YEAR') retorna o primeiro dia do ano da data.

SQL> SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR')


2 FROM SYS.DUAL

5.3 Funções de conversão

5.3.1 Formatos de Data

Formato Significado
CC ou SCC Século; S prefixa datas Antes de Cristo com "-"
YYYY ou SYYYY Ano; S prefixa datas Antes de Cristo com "-"
YYY, YY, Y Últimos 3,2,1 dígitos do ano
Y,YYY Ano com vírgula separando os milhares
YEAR ou SYEAR Ano por extenso. S prefixa datas Antes de Cristo com "-
"
BC ou AD Indicador de Antes ou Depois de Cristo
B.C. ou A.D. Idêntico a BC/AD com pontos
Q Quarto do ano (trimestre)
MM Mês
Month Mês por extenso, com 9 caracteres, espaços à direita
MON Nome do mês, com 3 caracteres
WW ou W Semana do ano ou do mês
DDD, DD, D Dia do ano, do mês, ou da semana
DAY Dia por extenso, com 9 caracteres, espaços à direita
DY Nome do dia, abreviado com 3 caracteres
J Dia Juliano (dias desde 31/12/4713 AC)
AM ou PM Indicador de meridiano
A.M. ou P.M. Indicador de meridiano com pontos
HH ou HH12 Hora do dia no intervalo 1 a 12
HH24 Hora do dia no intervalo 0 a 23
MI Minuto
SS Segundo
SSSS Segundos após à meia noite (0-86399)
/., etc... Pontuação reproduzida no resultado
"..." Caracteres entre aspas reproduzido no resultado

Notas:

1 - O prefixo 'FM' (fill mode) antes de MONTH ou DAY suprime os espaços à direita

2 - O sufixo 'TH' produz números ordinais ("DDTH" para "4TH")

3 - O sufixo 'SP' produz números por extenso ("DDSP" para "FOUR")

4 - O sufixo 'SPTH' para números ordinais por extenso ("DDSPTH" para "FOURTH")

5 - Os códigos são sensitivos a caracteres maiúsculos e minúsculos


36
5.3.2 TO_CHAR(número|data,['formato'])

Converte número ou data em caracter no formato especificado.

SQL> SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY')


2 FROM SYS.DUAL

Adicionando-se o prefixo fm (fill mode) para remover os espaços, e utilizando-se letras


maiúsculas e minúsculas temos:
SQL> SELECT TO_CHAR(SYSDATE, 'fmDay, ddth Month YYYY')
2 FROM SYS.DUAL

A função TO_CHAR pode ser usada para extrair a hora do dia apenas.

SQL> SELECT TO_CHAR(SYSDATE, 'HH:MI:SS')


2 FROM SYS.DUAL

A função TO_CHAR pode ser usada para converter números em caracteres aplicando a
formatação desejada.

SQL> SELECT TO_CHAR(VL_SALARIO,'$9,999')


2 FROM EMPREGADO

5.3.3 Formatos Numéricos

Formato Significado Exemplo


9 posição numérica (um 9 para cada número) 999999 1234
0 zeros à esquerda 099999 001234
$ cifrão à esquerda $99999 $1234
. ponto decimal na posição especificada 999999.99 1234.00
, vírgula na posição especificada 999,999 1,234
MI sinal de menos à direita 099999MI 1234-
PR números negativos entre parênteses 999999PR (1234)
EEEE notação científica 99.999EEEE 1.234E+03

5.3.4 TO_NUMBER(cadeia_de_caracteres)

Converte a cadeia de caracteres, que deve conter um número, em um valor numérico.

SQL> SELECT CD_EMPREGADO , NM_EMPREGADO , TP_CARGO, VL_SALARIO


2 FROM EMPREGADO
3 WHERE VL_SALARIO > TO_NUMBER('1500')

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.
37
SQL> SELECT CD_EMPREGADO , NM_EMPREGADO , DT_ADMISSAO
2 FROM EMPREGADO
3 WHERE DT_ADMISSAO = TO_DATE('June 4,1984','Month dd,yyyy')

5.4 Funções que aceitam qualquer tipo de dado

5.4.1 DECODE(coluna|expressão,pes1,res1,[pes2,res2,...],default)

Funciona como uma estrutura, substituindo as pesquisas pelos resultados. A coluna ou


expressão é comparada com os argumentos de pesquisa, e se houver igualdade o
resultado correspondente é retornado. Se não houver igualdade, o valor default é
retornado.

Argumentos:

coluna|expressão a coluna ou expressão a ser avaliada


pes1 o primeiro valor a ser testado
res1 o valor a ser retornado se coluna ou expressão igual a pes1
pes2 o segundo valor a ser testado
res2 o valor a ser retornado se coluna ou expressão igual a pes2
default o valor a ser retornado se a coluna ou expressão for
diferente
de pes1, pes2,...,pesN.

Notas:

-coluna ou expressão podem ser de qualquer tipo de dados.

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

-O valor retornado é sempre do mesmo tipo do terceiro argumento (resultado1)


No exemplo abaixo o cargo BALCONIST é transformado em FUNCIONÁRIO, o cargo
GERENTE é transformado em CHEFE, e os demais cargos são transformados em
INDEFINIDO.

SQL> SELECT NM_EMPREGADO , TP_CARGO,


2 DECODE(TP_CARGO, 'BALCONIST', 'FUNCIONÁRIO', 'GERENTE',
'CHEFE', 'INDEFINIDO') DECODED_TP_CARGO
4 FROM EMPREGADO

Para fazer um aumento salarial diferenciado por cargo:

SQL> SELECT TP_CARGO, VL_SALARIO,


2 DECODE(TP_CARGO,'ANALISTA',VL_SALARIO*1.1, 'BALCONIST',
VL_SALARIO*1.15, 'GERENTE',VL_SALARIO*0.95, VL_SALARIO)
SALARIO_DECODIFICADO
4 FROM EMPREGADO

5.4.2 NVL(coluna|valor, valor)

38
Converte valores nulos do primeiro argumento no valor especificado no segundo
argumento.

SQL> SELECT VL_SALARIO*12+NVL(VL_COMISSAO,0), NVL(VL_COMISSAO,1000),


VL_SALARIO*12+NVL(VL_COMISSAO,1000)
2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 10

5.4.3 GREATEST(coluna|valor, coluna|valor,...)

Retorna o maior dos valores de uma lista de valores.

SQL> SELECT GREATEST(1000,2000), GREATEST(VL_SALARIO,VL_COMISSAO)


2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 30

5.4.4 LEAST(coluna|valor, coluna|valor,...)

Retorna o menor dos valores de uma lista de valores.

SQL> SELECT LEAST(1000,2000), LEAST(VL_SALARIO,VL_COMISSAO)


2 FROM EMPREGADO
3 WHERE CD_DEPARTAMENTO = 30

5.4.5 Funções aninhadas revisitadas

SQL> SELECT NM_EMPREGADO , NVL(TO_CHAR(CD_EMPREGADO_GERENTE),'NAO


GERENCIAVEL')
2 FROM EMPREGADO
3 WHERE CD_EMPREGADO_GERENTE IS NULL

SQL> SELECT SYSDATE,


2 TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),
3 'Day dd Month YYYY')
4 FROM SYS.DUAL

5.5 Exercícios

a) Mostrar o nome e a data de admissão dos empregados do departamento 20. Utilize o


aliás DATA_DE_ADMISSAO para o nome da coluna.
NM_EMPREGADO DATA_DE_ADMISSAO
------------ ---------------------------
SMITH June, Thirteenth 1983
JONES October, Thirty-First 1983
SCOTT March, Fifth 1984
ADAMS June, Fourth 1984
FORD December, Fifth 1983

b) Exibir o nome de cada empregado, juntamente com a data de admissão e a data de


revisão do salário. Assuma a data de revisão um ano após a data de admissão. Classificar
a saída em ordem ascendente da data de revisão do salário.

39
NM_EMPREGADO DT_ADMISSAO REVISAO
------------ ----------- ---------
SMITH 13-JUN-83 13-JUN-84
ALLEN 15-AUG-83 15-AUG-84
JONES 31-OCT-83 31-OCT-84
MILLER 21-NOV-83 21-NOV-84
MARTIN 05-DEC-83 05-DEC-84
FORD 05-DEC-83 05-DEC-84
SCOTT 05-MAR-84 05-MAR-85
WARD 26-MAR-84 26-MAR-85
CLARK 14-MAY-84 14-MAY-85
TURNER 04-JUN-84 04-JUN-85
ADAMS 04-JUN-84 04-JUN-85
BLAKE 11-JUN-84 11-JUN-85
KING 09-JUL-84 09-JUL-85
JAMES 23-JUL-84 23-JUL-85

c) Imprimir uma lista de empregados mostrando o salário, se este for superior a 1500. Se
o salário for inferior a 1500 deve ser exibido ABAIXO DE 1500, e se for igual a 1500
deve ser exibido NO LIMITE.
NM_EMPREGADO SALARIO
------------ --------------
ADAMS ABAIXO DE 1500
ALLEN 1600
BLAKE 2850
CLARK 2450
FORD 3000
JAMES ABAIXO DE 1500
JONES 2975
KING 5000
MARTIN ABAIXO DE 1500
MILLER ABAIXO DE 1500
SCOTT 3000
SMITH ABAIXO DE 1500
TURNER NO LIMITE
WARD 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.
NM_EMPREGADO 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 são numéricos, e se o caracter do meio é uma '/'. Imprima a
expressão 'SIM' se for válido, e 'NAO' se não for válido. Experimente as expressões
'12/34','01/1a','e '99\88'.
VALOR VALIDO?
----- -------
12/34 SIM

40
g) Empregados admitidos até o dia 15, inclusive, são pagos na última sexta-feira do mês.
Empregados admitidos após o dia 15 são pagos na última sexta-feira do mês seguinte.
Imprima uma relação contendo os nome dos empregados, as datas de admissão, e a
primeira data de pagamento.

NM_EMPREGADO DT_ADMISSAO DIA_DO_PAGAMENTO


------------ ----------- ----------------
SMITH 13-JUN-83 24-JUN-83
ALLEN 15-AUG-83 26-AUG-83
JONES 31-OCT-83 25-NOV-83
MILLER 21-NOV-83 30-DEC-83
MARTIN 05-DEC-83 30-DEC-83
FORD 05-DEC-83 30-DEC-83
SCOTT 05-MAR-84 30-MAR-84
WARD 26-MAR-84 27-APR-84
CLARK 14-MAY-84 25-MAY-84
TURNER 04-JUN-84 29-JUN-84
ADAMS 04-JUN-84 29-JUN-84
BLAKE 11-JUN-84 29-JUN-84
KING 09-JUL-84 27-JUL-84
JAMES 23-JUL-84 31-AUG-84

14 rows selected.

41
Apêndice A - Tabelas do Curso

Tabela EMPREGADO - Empregados


CD_EMPRE
CD_EMPRE NM_EMPRE GADO_ VL_COMI CD_DEPAR
GADO GADO TP_CARGO GERENTE DT_ADMISSAO VL_SALARIO SSAO TAMENTO
7369 SMITH BALCONIST 7902 13-jun-83 800 20
7499 ALLEN VENDEDOR 7698 15-ago-83 1.600 300 30
7521 WARD VENDEDOR 7698 26-mar-83 1.250 50 30
7566 JONES GERENTE 7839 31-out-83 2.975 20
7654 MARTIN VENDEDOR 7698 5-dez-83 1.250 1.400 30
7698 BLAKE GERENTE 7839 11-jun-84 2.850 30
7782 CLARK GERENTE 7839 14-mai-84 2.450 10
7788 SCOTT ANALISTA 7566 5-mar-84 3.000 20
7839 KING PRESIDENT 9-jul-84 5.000 10
7844 TURNER VENDEDOR 7698 4-jul-84 1.500 0 30
7876 ADAMS BALCONIST 7788 4-jul-84 1.100 20
7900 JAMES BALCONIST 7698 4-jul-84 950 30
7902 FORD ANALISTA 7566 5-dez-83 3.000 20
7934 MILLER BALCONIST 7782 21-nov-83 1.300 10

Tabela DEPARTAMENTO - Departamentos

CD_DEPARTAMENTO NM_DEPARTAMENTO DS_LOCAL


10 CONTABILIDADE ORLEANS
20 INVESTIGAÇÃO ORLEANS
30 VENDAS ORLEANS
40 OPERAÇÕES ORLENAS

42

Você também pode gostar