Вы находитесь на странице: 1из 27

Comandos SQL 3

DML 3
DDL 3
TCL 3
Controle de Sesso 3
Controle de Sistema 4
Resumo dos principais comandos 4

Tipos de Dados Oracle 4


Resumo Geral 4
NUMBER (<P>, <S>) 4
DATE 6
TIMESTAMP [<PRECISION>] 6
Exemplo de uso Operador de concatenao 7

Instruo SELECT 7
A tabela DUAL 8
Uso do WHERE para limitar os resultados de uma consulta. 8
ANY e SOME 8
ALL 9
IN e NOT IN 9
BETWEEN 9
EXISTS 10
IS NULL e IS NOT NULL 10
LIKE 11
Ordenao de linhas 11
Uso de expresses no SELECT 12
Expresso CASE 13

Exerccios 14

Funes De Uma Linha (Single-Row functions) Oracle 17

Consultas com Funes Agregadas, Group by, Having 21


Agrupando dados com GROUP BY 22
Funes de Grupo ou Agregadas 24
Limitando dados agrupados com HAVING 26
Comandos SQL

DML

usada para acessar, criar, modificar ou excluir dados nas estruturas existentes do banco
de dados.
As instrues DML incluem instrues para consultar informaes (SELECT), adicionar
novas linhas (INSERT), modificar linhas existentes (UPDATE), excluir linhas existentes
(DELETE), executar uma operao de atualizao ou insero condicional (MERGE), ver
um plano de execuo de SQL (EXPLAIN PLAN) e bloquear uma tabela para restringir o
acesso (LOCK TABLE). Incluir a instruo SELECT no grupo DML discutvel dentro da
comunidade SQL, uma vez que SELECT no modifica os dados.

DDL

Usado para definir, alterar ou descartar objetos de banco de dados e seus privilgios.
As instrues DDL incluem instrues para criar, modificar, descartar ou renomear objetos
(CREATE, ALTER, DROP, RENAME), remover todas as linhas de um objeto de banco de
dados sem perder a estrutura (TRUNCATE), gerenciar privilgios de acesso (GRANT,
REVOKE) , para auditoria de banco de dados (AUDIT, NOAUDIT) e adicionar uma
descrio sobre um objeto ao dicionrio (COMMENT).

TCL

Usado para agrupar um conjunto de instrues DML numa nica transao. Usando essas
instrues, voc pode salvar as alteraes (COMMIT) ou descartar as alteraes
(ROLLBACK) feitas por instrues DML. Tambm includas nas instrues de controle de
transao so declaraes para definir um ponto ou marcador na transao para possvel
reverso (SAVEPOINT) e definir as propriedades para a transao (SET TRANSACTION).

Controle de Sesso

Usado para controlar as propriedades de uma sesso de usurio. (Uma sesso o ponto a
partir do qual voc est conectado ao banco de dados at voc se desconectar.)
Declaraes de controle de sesso incluem aquelas para controlar as propriedades da
sesso (ALTER SESSION) e para ativar / desativar r oles(SET ROLE).
Controle de Sistema

Usado para gerenciar as propriedades do banco de dados. Existe apenas uma instruo
nesta categoria (ALTER SYSTEM).

Resumo dos principais comandos

Os comandos DML so SELECT, INSERT, UPDATE, DELETE e MERGE.


Os comandos DDL so CREATE, ALTER, DROP, RENAME, TRUNCATE e COMMENT.
Os comandos DCL so GRANT e REVOKE.
Os comandos TCL so COMMIT, ROLLBACK e SAVEPOINT.

Tipos de Dados Oracle

Resumo Geral

Category Datatypes
Character CHAR, NCHAR, VARCHAR2, NVARCHAR2
Number NUMBER, FLOAT, BINARY_FLOAT, BINARY_DOUBLE
Long and raw LONG, LONG RAW, RAW
Date and time DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE,
TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL YEAR
TO MONTH, INTERVAL DAY TO SECOND
Large object CLOB, NCLOB, BLOB, BFILE
Row ID ROWID, UROWID

Vamos discutir somente 3 tipos, a saber: NUMBER, DATE, TIMESTAMP.

NUMBER (<P>, <S>)

O tipo de dados NUMBER armazena nmeros com uma preciso de <p> dgitos e uma
escala de <s> dgitos. Pode ser usado para armazenar nmeros inteiros, nmeros de ponto
fixo e nmeros de ponto flutuante.
A faixa de valores para a preciso <p> pode ser 1 a 38 e a para a escala <s> , -84 e 127.
A escala arredonda o valor aps o ponto decimal para <s> dgitos. Se voc definir uma
coluna como NUMBER (5,2), o intervalo de valores que voc pode armazenar nesta coluna
de -999,99 a 999,99; Ou seja, 5 - 2 = 3 para a parte inteira, e a parte decimal
arredondada para dois dgitos. Mesmo se voc no incluir a parte decimal para o valor
inserido, o nmero mximo que voc pode armazenar em uma definio NUMBER (5,2)
999.

A Oracle redonda nmeros inseridos em colunas numricas com uma escala menor que o
nmero inserido. Por exemplo, se uma coluna foi definida como NUMBER (4,2) e voc
especificou um valor de 12,125 para entrar nessa coluna, o nmero resultante seria
arredondado para 12,13 antes de ser inserido na coluna. Se o valor excede a preciso, no
entanto, um erro do Oracle retornado. Por exemplo, voc no pode inserir 123.1 em uma
coluna definida como NUMBER (4,2).

Se voc especificar uma escala maior que o valor de preciso, a preciso define o nmero
mximo de dgitos direita do ponto decimal aps os zeros. Por exemplo, se uma coluna
definida como NUMBER (3,5), o intervalo de valores que voc pode armazenar de
-0,00999 a 0,00999; Ou seja, ele requer dois zeros (<s> - <p>) aps o ponto decimal e
arredonda a parte decimal para trs dgitos (<p>) aps zeros. A Tabela a seguir mostra
vrios exemplos de como os dados numricos so armazenados com vrias definies.

Tabela com valores armazenados para o tipo NUMBER.


Valor
Valor Tipo Armazenado Explicao
123.2564 NUMBER 123.2564 O intervalo e a preciso so definidos para o
mximo, para que o tipo de dados pode
armazenar qualquer valor.
1234.9876 NUMBER(6,2) 1234.99 Como a escala apenas 2, a parte decimal do
valor arredondada para dois dgitos.
12345.12345 NUMBER(6,2) Error O intervalo da parte inteira apenas de -9999 a
9999.
123456 NUMBER(6,2) Error A preciso maior do que o especificado; O
intervalo apenas de -9999 a 9999.
1234.9876 NUMBER(6) 1235 A parte decimal arredondada para o prximo
inteiro.
123456.1 NUMBER(6) 123456 A parte decimal arredondada.
12345.345 NUMBER(5,-2) 12300 The negative scale rounds the number <s>
digits left to the decimal point. 2 rounds to
hundreds.
A escala negativa arredonda o nmero <s>
dgitos esquerda do ponto decimal. -2
arrendonda para centenas.
1234567 NUMBER(5,-2) 1234600 Arredondado para a centena mais prxima.
12345678 NUMBER(5,-2) Error Fora do intervalo; Pode ter apenas cinco dgitos,
excluindo os dois zeros representando
centenas, para um total de sete dgitos: (s - (-p)
= s + p = 5 + 2 = 7).
123456789 NUMBER(5,-4) 123460000 Arredondado para o mais prximo 10.000.
1234567890 NUMBER(5,-4) Error Fora do intervalo; Pode ter apenas cinco dgitos,
excluindo os quatro zeros direita.
12345.58 NUMBER(*, 1) 12345.6 O uso de * na preciso especifica o limite
padro (38).
0.1 NUMBER(4,5) Error Requer um zero aps o ponto decimal (5 - 4 =
1).
0.01234567 NUMBER(4,5) 0.01235 Arredondado para quatro dgitos aps o ponto
decimal e zero.
0.09999 NUMBER(4,5) 0.09999 Armazenado como ; Apenas quatro dgitos
aps o ponto decimal e zero.
0.099996 NUMBER(4,5) Error Arredondando este valor para quatro dgitos
aps o decimal e zero resulta em 0,1, que est
fora do intervalo.

DATE

O tipo de dados DATE ocupa um espao de armazenamento de 7 bytes. As informaes a


seguir esto contidas em cada tipo de dados DATE: Sculo, Ano, Ms, Dia, Hora, Minuto e
Segundo.

A funo TO_DATE usada para inserir valores do tipo DATE. Um DATE exibido na tela
seguinte formatao, DD-MON-YY.

A funo SYSDATE retorna a data e hora do sistema atual.

Experimente:

SELECT SYSDATE As "Data de Hoje" FROM DUAL;

TIMESTAMP [<PRECISION>]

A nica diferena entre os tipos de dados DATE e TIMESTAMP a capacidade de


armazenar segundos fracionrios at uma preciso de nove dgitos. Semelhante funo
SYSDATE, a funo SYSTIMESTAMP retorna a data e hora do sistema atual.

Experimente:
SELECT SYSTIMESTAMP AS "Data e hora de Hoje" FROM DUAL;
Exemplo de uso Operador de concatenao

'Oracle11g' || 'Database' resulta em ' Oracle11gDatabase'.


Literais

Literais so valores que representam um valor fixo (constante). Existem quatro tipos de
literais:
Text (or character)
Numeric (integer and number)
Datetime
Interval

Tipo de Literal Exemplos


Text (or character) 'The Quick Brown Fox'
'That mans suit is black'
'12-SEP-2001'
Q#The Quick Brown Fox#
q{That man's suit is black}
Numeric (integer and number) 23, -2, 23E10
Datetime DATE 2008-03-24
TIMESTAMP 2008-03-24 03:25:34.123
TIMESTAMP 2008-03-24 03:25:34.123 US/Central
Alguns literais.

Instruo SELECT

-- Com Alias
SELECT job_title AS Title, min_salary AS "Minimum Salary"
FROM hr.jobs;

-- Tuplas nicas
SELECT DISTINCT department_id
FROM hr.employees;
A tabela DUAL

A tabela DUAL uma tabela fictcia disponvel para todos os usurios no banco de dados.
Tem uma coluna e uma linha. A tabela DUAL usada para selecionar variveis do sistema
ou para avaliar uma expresso. Aqui esto alguns exemplos.

SELECT SYSDATE, USER FROM dual;

SELECT SYSDATE, USER "Usurio" FROM dual;

Uso do WHERE para limitar os resultados de uma consulta.

Como voc lista os funcionrios que trabalham para o departamento 90?

SELECT first_name || ' ' || last_name "Name", department_id


FROM hr.employees
WHERE department_id = 90;

ANY e SOME

Voc pode usar o operador ANY ou SOME para comparar um valor com cada valor em uma
lista ou subconsulta. Os operadores ANY e SOME sempre devem ser precedidos por um
dos seguintes operadores: =,! =, <,>, <=, ou > =.

Qualquer funcionrio(employee) cujo id de departamento seja menor ou igual que um dos


elementos da lista:

SELECT first_name || ' ' || last_name "Name", department_id


FROM hr.employees
WHERE department_id <= ANY (10, 15, 20, 25);

A condio na clusula WHERE acima equivalente a:


department_id >= 10 OR department_id >= 15 O
R department_id >= 20 OR
department_id >= 20
ALL

Voc pode usar o operador ALL para comparar um valor com cada valor em uma lista ou
subconsulta.

Qualquer funcionrio(employee) cujo id de departamento seja maior ou igual que todos os


elementos da lista:

SELECT first_name || ' ' || last_name "Name", department_id


FROM hr.employees
WHERE department_id >= ALL (80, 90, 100);

A condio na clusula WHERE acima equivalente a:


department_id >= 80 AND department_id >= 90 AND d
epartment_id >= 100

IN e NOT IN

ertencer.
Voc pode usar os operadores IN e NOT IN para testar uma condio de p

Todos os funcionrios dos departamentos de id 10, 20 ou 90:

SELECT first_name, last_name, department_id


FROM hr.employees
WHERE department_id IN (10, 20, 90);

BETWEEN

Voc pode usar o operador BETWEEN para testar um intervalo.

Listar os funcionrios com salrio entre R$ 5.000,00 e R$ 6.000,00:


SELECT first_name, last_name, salary
FROM employees
WHERE salary BETWEEN 5000 AND 6000;

EXISTS

O operador EXISTS sempre seguido por uma subconsulta entre parnteses.

O exemplo a seguir lista os funcionrios que trabalham para o departamento de


administrao.

SELECT last_name, first_name, department_id


FROM hr.employees e
WHERE EXISTS (select 1 FROM hr.departments d
WHERE d.department_id = e.department_id
AND d.department_name = 'Administration');

IS NULL e IS NOT NULL

Para localizar os valores NULL ou valores NOT NULL, voc precisar usar o operador IS
NULL. O operador = ou != No funcionar com valores NULL.

Listar funcionrio sem departamento:

SELECT last_name, department_id


FROM hr.employees
WHERE department_id IS NULL;

SELECT last_name, department_id


FROM hr.employees
WHERE department_id = NULL; -- no vai funcionar

LIKE

Usando o operador LIKE, voc pode executar a correspondncia de padres. O caractere


de pesquisa de padro % usado para corresponder a qualquer caractere e qualquer
nmero de caracteres. O caractere de pesquisa de padres _ usado para corresponder a
qualquer caractere (um caractere apenas).

Obtm os funcionrios cujo nome comea por 'Su' e o sobrenome no comea por 'S':

SELECT first_name, last_name


FROM hr.employees
WHERE first_name LIKE 'Su%'
AND last_name NOT LIKE 'S%';

Obtm as vagas que iniciam por 'AC_':

SELECT job_id, job_title


FROM hr.jobs
WHERE job_id like 'AC\_%' ESCAPE '\';

Ordenao de linhas

A instruo SELECT pode incluir a clusula ORDER BY para classificar as linhas


resultantes em uma ordem especfica com base nos dados nas colunas.

Para recuperar todos os nomes de funcionrios do departamento 90 da tabela hr.employees


ordenados por sobrenome, use esta consulta:

SELECT first_name || ' ' || last_name "Employee Name"


FROM hr.employees
WHERE department_id = 90
ORDER BY last_name;

SELECT first_name, hire_date, salary, manager_id mid


FROM hr.employees
WHERE department_id IN (110,100)
ORDER BY mid ASC, salary DESC, hire_date;

Esta consulta tem um erro:

SELECT DISTINCT 'Region ' || region_id


FROM hr.countries
ORDER BY region_id;

Correo:

SELECT DISTINCT 'Region ' || region_id


FROM hr.countries
ORDER BY 'Region ' || region_id;

A clusula ORDER BY no pode ter mais de 255 colunas ou expresses. Alis, esse
nmero, 255, aparece como limitao em outras clusulas do SQL.

Uso de expresses no SELECT

Expresses podem aparecer nas clusulas a seguir:

A clusula SELECT das consultas;


A clusula WHERE, a clusula ORDER BY e a clusula HAVING;
A clusula VALUES da instruo INSERT;
A clusula SET da instruo UPDATE.

Expresso CASE

Aqui est a sintaxe da expresso CASE simples:

CASE <expression>
WHEN <compare value> THEN <return value> ... ... ...
[ELSE <return value>]
END

SELECT country_name, region_id,


CASE region_id WHEN 1 THEN 'Europe'
WHEN 2 THEN 'America'
WHEN 3 THEN 'Asia'
ELSE 'Other' END Continent
FROM hr.countries
WHERE country_name LIKE 'I%';

SELECT first_name, department_id, salary,


CASE WHEN salary < 6000 THEN 'Low'
WHEN salary < 10000 THEN 'Medium'
WHEN salary >= 10000 THEN 'High' END Category
FROM hr.employees
WHERE department_id <= 30
ORDER BY first_name;

Nota: O CASE, nestes exemplos, faz o papel de coluna. No primeiro exemplo, o a


lias
Continent e no segundo o alias Category.
Exerccios

1) Voc emite a seguinte consulta:

SELECT salary "Employee Salary"


FROM hr.employees;

Como o ttulo da coluna aparecer no resultado?

1. EMPLOYEE SALARY
2. EMPLOYEE_SALARY
3. Employee Salary
4. employee_salary

2) Na seguinte instruo SELECT, qual componente um literal? (Escolha todas as opes


aplicveis.)

SELECT 'Employee Name: ' || ename


FROM emp where deptno = 10;

1. 10
2. ename
3. Employee Name:
4. ||

3) Quando voc tenta salvar 34567.2255 em uma coluna definida como NUMBER (7,2),
qual valor realmente salvo?

1. 34567.00
2. 34567.23
3. 34567.22
4. 3456.22

Dica: Rever a tabela de numbers.

4) Voc emite a seguinte consulta:

SELECT empno, ename


FROM emp
WHERE empno = 7782 OR empno = 7876;

Qual outro operador pode substituir a condio OR na clusula WHERE?


1. IN
2. BETWEEN .. AND ..
3. LIKE
4. <=
5. >=

5) Qual instruo procura por valores de PRODUCT_ID que comeam com DI_ da tabela
ORDERS?

1) SELECT * FROM ORDERS


WHERE PRODUCT_ID = 'DI%';
2) SELECT * FROM ORDERS
WHERE PRODUCT_ID LIKE 'DI_' ESCAPE '\';
3) SELECT * FROM ORDERS
WHERE PRODUCT_ID LIKE 'DI\_%' ESCAPE '\';
4) SELECT * FROM ORDERS
WHERE PRODUCT_ID LIKE 'DI\_' ESCAPE '\';
5) SELECT * FROM ORDERS
WHERE PRODUCT_ID LIKE 'DI_%' ESCAPE '\';

6) A tabela EMPLOYEE tem os seguintes dados:

EMP_NAME HIRE_DATE SALARY


---------- --------- ----------
SMITH 17-DEC-90 800
ALLEN 20-FEB-91 1600
WARD 22-FEB-91 1250
JONES 02-APR-91 5975
WARDEN 28-SEP-91 1250
BLAKE 01-MAY-91 2850

Qual ser o valor na primeira linha do conjunto de resultados quando a seguinte consulta for
executada?
SELECT hire_date FROM employee
ORDER BY salary, emp_name;

1. 02-APR-91
2. 17-DEC-90
3. 28-SEP-91
4. A consulta invlida, porque voc no pode ter uma coluna na clusula ORDER BY
que no faz parte da clusula SELECT.
7) Ao fazer correspondncia de padres usando o operador LIKE, qual caractere usado
como o caractere de escape padro por Oracle?

1. |
2. /
3. \
4. No existe nenhum caractere de escape padro no Oracle.
5.
Funes De Uma Linha (Single-Row functions) Oracle

O Oracle dispe de diversas funes que podem ser incorporadas no SQL e no PL/SQL.
Estas funes podem ser usadas em clusulas SELECT, WHERE e ORDER BY. Por
exemplo, a consulta a seguir inclui as funes de uma linha (single-row functions),
TO_CHAR, UPPER e SOUNDEX:

SELECT first_name, TO_CHAR(hire_date,'Day, DD-Mon-YYYY')


FROM employees
WHERE UPPER(first_name) LIKE 'AL%'
ORDER BY SOUNDEX(first_name);

As funes de uma linha tambm podem aparecer em outros tipos de instrues, como a
clusula SET de uma instruo UPDATE, a clusula VALUES de uma instruo INSERT e a
clusula WHERE de uma instruo DELETE.

Funes para Tratamento de valores NULL

Os valores NULL representam dados desconhecidos ou falta de dados. Qualquer operao


em um NULL resulta em um NULL. Oracle oferece 5 funes para tratar o NULL, mas
vamos nos concetrar em apenas 3: NVL, NVL2 e COALESCE.

NVL

A funo NVL usada para substituir um valor NULL por um valor literal. NVL leva dois
argumentos. Se o primeiro argumento for NULL, ento retorna o segundo argumento.

Por exemplo, suponha que voc precise calcular a remunerao total na tabela
EMPLOYEES, que contm colunas SALARY e COMMISSION_PCT

SELECT first_name, salary, commission_pct,


salary + (salary * commission_pct) compensation
FROM employees
WHERE first_name LIKE 'T%';
Voc v que somente Taylor teve a compensao total calculada no SQL; Todos os outros
tm sua compensao total como NULL. Isso ocorre porque qualquer operao em NULL
resulta em um NULL.

Voc pode usar a funo NVL para substituir um zero no lugar de qualquer NULL que voc
encontrar, como neste exemplo:

SELECT first_name, salary, commission_pct,


salary + (salary * NVL(commission_pct,0)) compensation
FROM employees
WHERE first_name LIKE 'T%';

NVL2

A funo NVL2 uma variao de NVL. NVL2 tem trs argumentos, NVL2 (x1, x2, x3), onde
x1, x2 e x3 so expresses. NVL2 retorna x2 se x1 no for NULL e x3 quando x1 for NULL.

Para o exemplo apresentado na seo anterior, voc tambm pode usar a funo NVL2 e
escrever o cdigo um pouco diferente:

SELECT first_name, salary, commission_pct, NVL2(commission_pct,


salary + salary * commission_pct, salary) compensation
FROM employees
WHERE first_name LIKE 'T%';

Usando a funo NVL2, se COMMISSION_PCT no for NULL, ento o salrio + salrio *


commission_pct retornado. Se COMMISSION_PCT for NULL, ento apenas SALARY
retornado.

COALESCE

COALESCE uma generalizao da funo NVL. COALESCE (exp_list) leva mais de um


argumento, onde exp_list uma lista de argumentos separados por vrgula. Esta funo
retorna o primeiro valor non-NULL em exp_list. Se todas as expresses em exp_list so
NULL, NULL retornado.

Considere o seguinte exemplo. O objectivo encontrar o salrio total baseado em


COMMISSION_PCT. Se COMMISSION_PCT no for NULL, calcule SALARY usando
COMMISSION_PCT. Se COMMISSION_PCT for NULL, d $ 100 como comisso. Se
SALARY no for definido (NULL) para um empregado, d o salrio mnimo de $ 900.
SELECT last_name, salary, commission_pct AS comm,
COALESCE(salary+salary*commission_pct,
salary+100, 900) compensation
FROM employees
WHERE last_name like 'T%';

Como voc pode ver no exemplo, usando a funo COALESCE ajuda a evitar escrever
vrias condies IF ... THEN. Voc poderia escrever o mesmo SQL usando a instruo
CASE que voc aprendeu no Captulo 1 da seguinte maneira (s que mais trabalho):

SELECT last_name, salary, commission_pct AS comm,


(CASE WHEN salary IS NULL THEN 900
WHEN commission_pct IS NOT NULL
THEN salary+salary*commission_pct
WHEN commission_pct IS NULL THEN salary+100
ELSE 0 END) AS compensation
FROM employees
WHERE last_name like 'T%';

Tente usar WHEN salary IS NULL na terceira condio na instruo CASE (em vez da
primeira condio) e tente ver alguma diferena no resultado.

Funes de Caracter (single-row)

A tabela a seguir resume as funes de caracter.

Funo Descrio
ASCII Retorna o equivalente decimal ASCII de um caractere.
CHR Retorna o caractere dado o equivalente decimal.
CONCAT Concatena duas cadeias; Mesmo que o operador ||.
INITCAP Retorna a string com a primeira letra de cada palavra em letras
maisculas.
INSTR Localiza a posio inicial numrica de uma string dentro de uma
string.
INSTRB O mesmo que INSTR mas conta bytes em vez de caracteres.
LENGTH Retorna o comprimento de uma string em caracteres.
LENGTHB Retorna o comprimento de uma string em bytes
LOWER Converte uma string em minsculas.
LPAD Preenche a esquerda de uma string com caractere especificado.
LTRIM Tira os caracteres de espao no incio de uma string.
REPLACE Realiza pesquisa de substring e substitui.
RPAD Anlogo ao LPAD, s que preenche direita da string.
RTRIM Tira os caracteres direita de uma seqncia de caracteres.
SOUNDEX Retorna uma representao fontica de uma string.
SUBSTR Retorna uma substring
SUBSTRB Retorna uma substring usando posies dos bytes.
TRANSLATE Executa a pesquisa e substituio de caracteres.
TRIM Realiza o LTRIM e RTRIM ao mesmo tempo.
UPPER transforma a string para caixa-alta.

Funes Numricas.

Desculpe , olhe na documentao.

PS: Acho que no cai e se cair d para descobrir a resposta.

Funes de Datas

SYSDATE

SYSDATE no recebe argumentos e retorna a data e hora atuais.

The value is returned in a DATE datatype. The format that the value returned is based on
NLS_DATE_FORMAT, which can be altered for the session using the ALTER SESSION
SET NLS_DATE_FORMAT command.

ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH:MI:SS AM';

SELECT SYSDATE FROM dual;

SYSTIMESTAMP
Anlogo ao SYSDATE.

ADD_MONTHS

ADD_MONTHS (d, i) leva dois argumentos, onde d uma data e i um inteiro. Essa funo
retorna a data d mais i meses. Se i um nmero decimal, o banco de dados implicitamente
converte-lo para um nmero inteiro, truncando a parte decimal (por exemplo, 3.9 torna-se
3).
SELECT SYSDATE, ADD_MONTHS(SYSDATE, -1) PREV_MONTH,
ADD_MONTHS(SYSDATE, 12) NEXT_YEAR
FROM dual;

EXTRACT

EXTRACT (c FROM dt) extrai e retorna o componente c especificado de data / hora ou


expresso de intervalo dt. Os componentes vlidos so: YEAR, MONTH, DAY, HOUR,
MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_MINUTE, TIMEZONE_REGION, and
TIMEZONE_ABBR. Lembre-se, O componente especificado deve existir na expresso.

Embora HOUR, MINUTE e SECOND existam no tipo de dados DATE, voc pode extrair
apenas YEAR, MONTH e DAY a partir das expresses do tipo DATE (?).

SELECT SYSDATE, EXTRACT(YEAR FROM SYSDATE) year_d


FROM dual;

Voc pode extrair YEAR, MONTH, DAY, HOUR, MINUTE, e SECOND da expresso de tipo
de dados TIMESTAMP.

SELECT LOCALTIMESTAMP1 ,
EXTRACT(YEAR FROM LOCALTIMESTAMP) YEAR_TS,
EXTRACT(DAY FROM LOCALTIMESTAMP) DAY_TS,
EXTRACT(SECOND FROM LOCALTIMESTAMP) SECOND_TS
FROM dual;

H mais funes de Data que voc pode consultar na documentao.

Consultas com Funes Agregadas, G


roup by, Having

As funes de grupo s vezes so chamadas funes agregadas e retornam um valor com


base no total de entradas. O nmero exato de entradas no determinado at que a
consulta seja executada e todas as linhas sejam buscadas. So exemplos de funes
agregadas: COUNT, SUM, UNIQUE, etc.

1
LOCALTIMESTAMP, data e hora no fuso-horrio do usurio logado.
Agrupando dados com GROUP BY

Como o nome indica, as funes de grupo funcionam em dados agrupados. Voc diz ao
banco de dados como agrupar ou categorizar os dados com uma clusula GROUP BY.
Sempre que voc usar uma funo de grupo na clusula SELECT, voc deve colocar todas
as colunas no-agregadas / no-constantes na clusula GROUP BY.

A sintaxe bsica do uso do GROUP BY esta:

SELECT [column names], group_function (column_name), ... ... ...


FROM table
[WHERE condition]
[GROUP BY column names]
[ORDER BY column names]

Exemplo 1: Contar a quantidade de funcionrios.

SELECT COUNT(*) FROM hr.employees;

Como no h nenhuma outra coluna na clusula SELECT, no necessrio especificar a


clusula GROUP BY. Agora suponha que voc quer descobrir o nmero de funcionrios em
cada departamento; Voc pode incluir department_id na clusula SELECT.

SELECT department_id, COUNT(*) "#Employees"


FROM hr.employees;

SELECT department_id, COUNT(*) "#Employees"


*
ERROR at line 1:
ORA-00937: not a single-group group function

Como voc usou uma funo agregada e uma coluna no agregada, o Oracle deu um erro
e est dizendo para agrupar os dados. Se voc incluir uma funo de grupo na clusula
SELECT, voc no poder selecionar resultados individuais a menos que se use a clusula
GROUP BY. Certifique-se de que todas as colunas na clusula SELECT que no foram
passadas na funo de grupo esto includas na clusula GROUP BY. Em outras palavras,
a coluna department_id no-agregada.

A seguite consulta retorna o total funcionrios por departamento


SELECT department_id, COUNT(*) "#Employees"
FROM hr.employees
GROUP BY department_id;

Se voc deseja que as linhas sejam organizadas na ordem do nmero de funcionrios, voc
pode especificar a funo de agregao na clusula ORDER BY ou usar a posio da
coluna, como exemplificado a seguir.

SELECT department_id, COUNT(*) "#Employees"


FROM hr.employees
GROUP BY department_id
ORDER BY count(*) DESC, department_id;

Ou

SELECT department_id, COUNT(*) "#Employees"


FROM hr.employees
GROUP BY department_id
ORDER BY 2 DESC, department_id;

A consulta a seguir produz um erro, pois GROUP BY no admite nem aliases nem p
osio
de coluna.

SELECT department_id, COUNT(*) "#Employees"


FROM employees
GROUP BY 1;
SELECT department_id, COUNT(*) "#Employees"
*
ERROR at line 1:
ORA-00979: not a GROUP BY expression

Uma coluna agrupada pelo GROUP BY no precisa estar na clusula SELECT. No


exemplo a seguir podemos calcular a mdia salarial por departamento sem precisar
mencion-los no resultado.

SELECT AVG(salary) average_salary


FROM hr.employees
GROUP BY department_id;
Se voc tiver mais de uma coluna na clusula GROUP BY, o Oracle criar grupos dentro de
grupos. A ordem das colunas na clusula GROUP BY determina o agrupamento.

SELECT department_id, job_id, COUNT(*)


FROM employees
GROUP BY department_id, job_id
ORDER BY 1, 2;

Funes de Grupo ou Agregadas

A seguir um breve descrio com exemplos de algumas funes agregadas do Oracle.

AVG - Esta funo tem a sintaxe AVG ([{DISTINCT | ALL}] n), onde n uma expresso
numrica. A funo AVG devolve a mdia da expresso n.

SELECT job_id, AVG(salary)


FROM hr.employees
WHERE job_id like 'AC%'
GROUP BY job_id;

No exemplo abaixo, a expresso ser avaliada em primeiro lugar, e seu resultado ser
utilizado para calcular a mdia.

SELECT deptno, AVG(sal + NVL(comm,0)) avg_comp


FROM scott.emp
WHERE deptno = 30
GROUP BY deptno;

As funes de grupo ignoram valores NULL. Se a funo NVL no fosse utilizada, os


empregados sem comisso no seriam includos no clculo da mdia.

COUNT - Esta funo tem a sintaxe COUNT ({* | [DISTINCT | ALL] <x>}), onde x uma
expresso. A funo COUNT retorna o nmero de linhas na consulta. Se uma expresso
dada e nem DISTINCT nem ALL especificado, o padro ALL.

No exemplo a seguir, calculado o total de linhas na tabela EMPLOYEES (o total de


funcionrios), o total de departamentos que tm funcionrios neles (DEPT_COUNT), e o
total de funcionrios que possuem um departamento (NON_NULL_DEPT_COUNT).

SELECT COUNT(*) emp_count,


COUNT(DISTINCT department_id) dept_count,
COUNT(ALL department_id) non_null_dept_count
FROM hr.employees;

Voc pode perceber a partir dos resultados que um funcionrio no atribudo a um


departamento (por isso 107 em EMP_OUNT), e os outros 106 so atribudos a um dos 11
departamentos.

O prximo exemplo analisa o total de funcionrios que compem uma comisso, bem como
o total distinto de comisses. Voc pode ver que 35 de 107 empregados recebem uma
comisso e que existem 7 nveis diferentes de comisso em uso.

SELECT COUNT(*),
COUNT(commission_pct) comm_count,
COUNT(DISTINCT commission_pct) distinct_comm
FROM hr.employees;

Dica: COUNT a nica funo agregada que no retorna NULL quando os dados so todos
NULL. Nestes casos, COUNT retorna 0.

MAX e MIN

A sintaxe MAX ([{DISTINCT | ALL}] <x>), onde x uma expresso. Esta funo retorna o
valor mais alto na expresso x. X pode ser um valor de data / hora, numrico ou de
caractere. Embora a incluso de DISTINCT ou ALL seja sintaticamente aceitvel, a sua
utilizao no afeta o clculo da funo MAX; O maior valor distinto o mesmo que o maior
de todos os valores.

Tudo que foi escrito sobre MAX se aplica de forma anloga para MIN, a diferena que
MIN retorna o menor valor.

SELECT MAX(hire_date),
MAX(salary),
MAX(last_name)
FROM hr.employees;

SELECT MIN(hire_date),
MIN(salary),
MIN(last_name)
FROM hr.employees;
SELECT job_id, MIN(hire_date) oldest, MIN(salary) low_sal,
MAX(salary) high_sal
FROM hr.employees
WHERE job_id like '%CLERK'
GROUP BY job_id;

SUM - Esta funo tem a sintaxe SUM ([{DISTINCT | ALL}] <x>), onde x uma expresso
numrica. Esta funo retorna a soma da expresso x.

Neste exemplo, a soma e a mdia de todos os salrios agrupado por cdigo de rea de
telefone.

SELECT SUBSTR(phone_number, 1,3) area_code,


SUM(salary) total_sal, ROUND(AVG(salary)) avg_sal
FROM hr.employees
GROUP BY SUBSTR(phone_number, 1,3);

Limitando dados agrupados com HAVING

Uma instruo SELECT inclui uma clusula HAVING para filtrar os dados agrupados. Por
exemplo, se voc quiser consultar o salrio total por departamento, excluindo o
departamento 50 e retornar apenas as linhas com mais de 10.000 na coluna de salrio total,
voc teria problemas com a seguinte consulta:

SELECT department_id, sum(salary) total_sal


FROM hr.employees
WHERE department_id != 50
AND SUM(salary) > 10000
GROUP BY department_id;

O banco de dados no sabe qual a soma quando extrai as linhas da tabela - lembre-se de
que o agrupamento feito depois que todas as linhas foram buscadas. Voc recebe uma
exceo ao tentar usar SUM na clusula WHERE.

A maneira correta de obter as informaes solicitadas instruir o banco de dados a agrupar


todas as linhas e, em seguida, limitar a sada dessas linhas agrupadas. Voc faz isso
usando a clusula HAVING.
SELECT department_id, sum(salary) total_sal
FROM hr.employees
WHERE department_id != 50
GROUP BY department_id
HAVING SUM(salary) > 10000;

Como visto no exemplo anterior, WHERE filtra os dados antes do


agrupamento; HAVING filtra os dados aps o agrupamento.

Вам также может понравиться