You are on page 1of 111

I - INTRODUÇÃO

I.1 - OBJETIVOS DO CURSO

Paulo André
PÁG. 1
 Neste curso você aprenderá a usar o SQL*Plus para:

• Definir e alterar a estrutura de um banco de dados;


• Consultar, inserir, alterar ou remover informações de um banco de
dados;

• Gerar relatórios a partir de consultas;


• Gerenciar a segurança e o desempenho de um banco de dados.
• Conhecer os princípios e terminologias da tecnologia Relacional.
• Utilizar blocos de linguagem PL/SQL.
• Realizar transações com PL/SQL.

Paulo André
PÁG. 2
I.2 - O QUE É BANCO DE DADOS?

 É um conjunto de informações armazenadas de forma organizada. No


tradicional sistema manual, as informações geralmente são armazenadas em
arquivos de papéis. Para recuperar as informações armazenadas, algum tipo de
procura manual é necessária. Já nos sistemas de armazenamento digitalizados, os
dados são armazenados em fitas magnéticas ou discos rígidos e o acesso aos
dados é feito através de softwares de computador.

 Por quê utilizar sistemas de computadores para armazenar


informações em Banco de Dados?

 Muitas vantagens surgem com a utilização de sistemas de


informações baseados em computadores como:

• Recuperação e atualização das informações;


• Armazenamento das informações em menor espaço do que no
sistema manual;

• Vários usuários podem compartilhar o mesmo dado e utilizá-lo para


diferentes tarefas;

• Controle de redundância das informações;


• Incompatibilidade de dados podem ser previstos;
• Forçar utilização de padronizações;
• Controle de acesso e integridade (segurança).

Paulo André
PÁG. 3
I.3 - RDBMS (RELATIONAL DATABASE MANAGEMENT SYSTEM)

 Para controlar o acesso e armazenamento de informações é


necessário a utilização de um Sistema de Gerenciamento de Banco de Dados
(DBMS). Um DBMS é um software que gerencia os pedidos dos usuários para
acesso às informações, um DBMS também controla o armazenamento, a
recuperação e a modificação dos dados de interesse dos usuários.

 O DBMS atua como “interface” entre o armazenamento físico dos


dados e os usuários. Quando um usuário efetua um pedido de acesso, o DBMS
intercepta este pedido e executa as operações necessárias no Banco de Dados.
Portanto, o DBMS “protege” os usuários do Banco de Dados dos detalhes técnicos
dos equipamentos, da estrutura de armazenamento e da estratégia de acesso.

 Quando um usuário envia uma solicitação ao DBMS, este intercepta a


solicitação, interpreta e realiza as operações necessárias no banco de dados.

 Várias alternativas existem para implementar um DBMS. Os tipos mais


utilizados são:

• Hierárquico
• Lista invertida
• Rede
• Relacional

 Os vários Banco de Dados que têm sido desenvolvidos recentemente


são Relacionais. O Sistema de Gerenciamento de Banco de Dados da ORACLE é
relacional. Por essa razão, nós estaremos nos concentrando unicamente no
acesso relacional ao Gerenciador de banco de dados.

Paulo André
PÁG. 4
I.4 - MODELO RELACIONAL

 O princípio do modelo relacional surgiu em junho de 1970 num artigo


publicado que se chamava “A Relational Model of Data for Large Shared Data
Banks”. Este artigo foi escrito por Dr. E.F. Codd.

 Para os usuários, o Banco de Dados Relacional é uma coleção de


tabelas bi-dimensionais as quais são de fácil compreensão. Existe quatro conceitos
que precisamos entender:

• Tabelas
• Colunas
• Linhas
• Campos

TABELA

Código Nome Endereço


1 Maria Rua 1
2 Pedro Rua 30 Linha

Campo

Coluna

 O modelo relacional imita uma parte da matemática conhecida como


Álgebra Relacional. Esse processo envolve:

• Uma coleção de objetos conhecidos como Relacionamentos;


• Um conjunto de ações que agem no relacionamento produzindo novos
relacionamentos.

 Uma relação pode ser vista como uma tabela. A recuperação de dados
é feita através de operações relacionais sobre estas tabelas.

I.5 - OPERADORES RELACIONAIS

Paulo André
PÁG. 5
RELAÇÃO DESCRIÇÃO

Restrição É uma operação que retira e mostra dados de


uma relação. É possível mostrar todas as linhas,
ou apenas aquelas que respeitem uma
determinada condição. Conhecida como
subconjunto horizontal.

Projeção É a operação que exibe certas colunas de uma


relação e é chamada de subconjunto vertical.

Produto É o resultado de quando linhas de dois conjuntos


de dados são concatenados. Todas as linhas do
primeiro conjunto são concatenados com as do
segundo. Produtos cartesianos produzem muitas
linhas.

Junção (join) É o resultado obtido quando dois conjuntos de


dados são concatenados de acordo com uma
determinada condição.

União Exibe todas as linhas que aparecem em ambas


as relações.

Intersecção Exibe apenas aquelas que existem em ambos os


conjuntos.

Diferença Mostra as linhas que aparecem em apenas uma


das relações.

UNION

Paulo André
PÁG. 6
INTERSECTION

DIFFERENCE

PRODUTO

Pedro P Vendedor Pedro Vendedor


Joao R Gerente = Pedro Gerente
Ricardo O Joao Vendedor
D Joao Gerente
Ricardo Vendedor
Ricardo Gerente
JOIN

Ricardo 10 J 10 Financeiro Ricardo 10 10 Financeiro


Joao 10 O 20 RH Joao 10 10 Financeiro
Pedro 20 I 30 Vendas = Pedro 20 20 RH
Jose 30 N 40 CPD Jose 30 30 Vendas

I.6 - PROPRIEDADES DE UM BANCO DE DADOS RELACIONAL

 Um banco de dados relacional apresenta-se como coleções de


relações (tabelas) ao usuário.

Paulo André
PÁG. 7
 O formato linha/coluna de uma tabela é a maneira usual de visualizar
os dados.

 Existe um conjunto de operadores para particionar e combinar


coleções de dados (seleção, projeção, produto, join, união, interseção, diferença).

 Não pode haver ponteiros explícitos. Conexões são realizadas


baseadas puramente em dados.

 A linguagem utilizada para pesquisa à base de dados é não-procedural


e parecida com o inglês.

 O usuário não precisa informar a rota de acesso ao dado e também


não precisa saber como os dados estão armazenados fisicamente.

 Todos comandos para manuseio dos dados são contemplados pela


linguagem SQL.

 Há uma total independência dos dados.

I.7 - PROPRIEDADE DE UMA COLEÇÃO DE DADOS TABULAR

 Uma única tabela possui as seguintes propriedades:

• Não pode haver linhas duplicadas;

• Não há colunas com nomes duplicados;

Paulo André
PÁG. 8
• A ordem de uma linha é insignificante;

• Valores são atômicos, não se decompõem.

SQL*Plus
Forms
Reports
Case
Pro*Oracle SQL ORACLE
Card KERNEL
Graphics
SQL*Net
SQL*Loader

I.8 - ARQUITETURA DE PRODUTOS ORACLE

 O RDBMS ORACLE é o produto principal da Oracle Corporation. Ele


inclui um gerenciador de banco de dados e diversas ferramentas para auxiliar os
usuários e o administrador do banco de dados - gerentes de sistema - a manter,
monitorar e utilizar os dados.

 O núcleo do RDBMS é o “kernel” o qual efetua as seguintes tarefas:

• Gerenciar a armazenagem e definição dos dados;

Paulo André
PÁG. 9
• Controlar e restringir o acesso e concorrência aos dados;
• Permitir “back-up” e recuperação de dados;
• Interpretar SQL.

 Os comandos SQL são utilizados pelos programadores e usuários


para acessar os dados num Banco de Dados ORACLE. Os programas aplicativos e
as ferramentas ORACLE freqüentemente permite aos usuários acessarem dados no
banco de dados sem diretamente utilizar SQL, mas essas aplicações devem
também utilizar SQL quando executar seus pedidos de acesso. Portanto o banco de
dados pode ser acessado unicamente utilizando SQL.

 Uma parte do Kernel é o otimizador. O otimizador examina rotas de


acesso para resolver e otimizar solicitações de um comando SQL.

 A ORACLE oferece uma variedade adicional de ferramentas para


acessar os dados no Banco de Dados.

Paulo André
PÁG. 10
I.9 - SQL

 Um sistema gerenciador de banco de dados necessita de uma


linguagem de consulta para permitir que o usuário acesse os dados. Structured
Query Language (SQL - pronuncia-se “sequel”) é a linguagem adotada pela maioria
dos bancos relacionais.

 O SQL foi desenvolvido em um protótipo de sistema de banco de


dados relacionais - sistema R - da IBM no meio dos anos 70. Em 1979, a Oracle
lançou o primeiro banco de dados relacional comercial que se utilizava de SQL.

I.10 - CARACTERÍSTICAS DO SQL

Paulo André
PÁG. 11
 SQL é uma linguagem “English-like”. Ela utiliza palavras como select,
insert, delete como parte de seu conjunto de comandos.

 SQL não é uma linguagem procedural. Você identifica quais


informações você precisa e não como buscá-las. Em outras palavras, a linguagem
SQL não requer que você especifique o método de acesso aos dados. Todos os
comandos SQL utilizam o otimizador - parte do “kernel” do RDBMS - para
determinar a maneira mais rápida de recuperar os dados.

 SQL processa conjuntos de registros ao invés de um único registro por


vez. A mais comum forma de conjunto é uma tabela.

 SQL pode ser usado por um conjunto de usuários incluindo DBA´s,


programadores, gerentes de pessoal e muitos outros grupos de usuários.

 SQL contém comandos que efetuam uma variedade de tarefas como:

• Consulta aos dados.

• Inserir, atualizar e remover linhas de uma tabela.

• Criar, modificar e remover objetos do Banco de Dados.

• Controlar o acesso ao Banco de Dados e seus objetos.

• Garantir a consistência do Banco de Dados.

Paulo André
PÁG. 12
I.11 - O QUE É SQL*Plus

 SQL*PLUS é uma interface pela qual pode-se entrar e executar


comandos SQL. Existe vários comandos de SQL*PLUS os quais podem facilitar
processos e formatar resultados de comandos de SQL, podendo editá-los e até
gravá-los.

 É a interface básica para manipulações genéricas de um banco de


dados ORACLE.

SQL*PLUS
SQL + Parâmetros de DB
controle de ORACLE
comandos Formatação
de controle

 Características principais:

• Interpretador de comandos SQL;

• Possui extensões para formatação de relatórios.

Paulo André
PÁG. 13
I.12 - PL/SQL

 Desde a versão 6 do ORACLE, foi introduzido uma opção no RDBMS


chamada PL/SQL (Procedural Language for SQL). PL/SQL aumenta a capacidade
do SQL oferecendo blocos de construtores procedimentais combinados com a
capacidade de manipulação de dados de forma não procedimental do SQL. As
principais caracterísiticas do PL/SQL são:

• Declaração de variáveis.
• Atribuições ( X := Y + Z).
• Controles condicionais ( IF, THEN, ELSE, ELSIF, GO TO).
• Repetições de comandos - looping ( FOR, WHILE, EXIT, WHEN).
• Gerenciamento de exceções.
• Aumenta a performance (operações processadas junto aos dados).
• Aumenta produtividade.

 O PL/SQL oferece:

• Aumento de Performance
⇒ Quando você utiliza SQL, seus comandos são enviados e
processados pelo RDBMS um por vez, enquanto um bloco de
comandos PL/SQL que contém um número de comandos SQL
combinados com construtores PL/SQL são enviados e
processados pelo RDBMS uma única vez. Esta característica
aumenta a performance especialmente em sistemas
cliente/servidor.

⇒ Comandos PL/SQL são tratados pela “engine” PL/SQL que faz


parte do “Kernel”, ou parte das ferramentas ORACLE. Comandos
SQL são executados pelo executor de SQL do “Kernel”.

• Aumento de Produtividade
⇒ PL/SQL adiciona o poder do processamento procedural no
desenvolvimento de aplicativos. Adicionalmente aplicativos

Paulo André
PÁG. 14
escritos em PL/SQL são portáveis para qualquer computador ou
sistema operacional que execute o ORACLE RDBMS.

⇒ O PL/SQL deve ser visto como uma tecnologia e não como um


produto externo ao RDBMS.

I.13 - PL/SQL NO ORACLE RDBMS

Paulo André
PÁG. 15
ORACLE RDBMS
Bloco PL/SQL Mecanismo

DECLARE Bloco PL/SQL


PROCEDURAL
PROCEDURAL DECLARE
BEGIN PROCEDURAL
PROCEDURAL PROCEDURAL Procedural
SQL BEGIN Statement
PROCEDURAL PROCEDURAL Executor
SQL SQL
END PROCEDURAL
SQL
END

SQL Statement Executor

Paulo André
PÁG. 16
I.14 - CONJUNTO DE COMANDOS SQL

SELECT Este é o comando mais utilizado, ele é utilizado


para recuperar dados do banco de dados.

INSERT / UPDATE / DELETE Estes comandos são utilizados para entrar com
novas linhas, alterar as linhas já existentes e
remove-lás das tabelas em um específico
Banco de Dados. São também conhecidos
como comandos DML (Data Manipulation
Language).

CREATE/ALTER/DROP Estes comandos são utilizados dinamicamente


para configurar (criar, alterar e remover)
estrutura de dados. São também conhecidos
como comandos DDL (Data Definition
Language).

GRANT/REVOKE Estes comandos são utilizados para controlar as


permissões de acesso ao Banco de Dados e
seus objetos.

Nota : Existem mais comandos SQL os quais estão referenciados no


SQL*PLUS, Reference Guide.

Paulo André
PÁG. 17
II - COMANDOS SQL e SQL*Plus

II.1 - CONTEÚDOS

Paulo André
PÁG. 18
1. Ativação do SQL*Plus

2. Criação de tabelas

3. Manipulação de tabelas

4. Formatação de relatórios

5. Edição de comandos

6. Outros comandos

II.2 - ATIVAÇÃO DO SQL*Plus

 Para entrar no SQL*Plus, digite:

Paulo André
PÁG. 19
$ sqlplus <ENTER>
SQL*Plus: Release 3.1.1.9.1 - Production on Wed Apr 3 08:56 …
Copyright (c) ORACLE Corporation 1979, 1992, All …
Enter user-name: oral1
Enter password: _________ a senha não é exibida
Connected to:
ORACLE7 Server Release 7.0.12.1.0 - Production
With the procedural option
PL/SQL Release 2.0.14.0.1 - Production
SQL>

ou a senha é exibida

$ sqlplus ora1/senha1
SQL*Plus: Release 3.1.1.9.1 - Production on Wed Apr 3 08:56 …
Copyright (c) ORACLE Corporation 1979,1992. All …
Connected to:
ORACLE7 Server Release 7.0.12.1.0 - Production
With the procedural option
PL/SQL Release 2.0.14.0.1 - Production
SQL>

 Para sair do sql*plus, digite:

SQL> exit

II.3 - ESCREVENDO COMANDOS SQL

 Quando escrevemos comandos SQL, é importante relembrar algumas


pequenas regras e diretrizes para construir comandos válidos como:

• Comandos SQL podem estar em uma ou mais linhas.

• Usualmente, as cláusulas são escritas em linhas separadas.


Paulo André
PÁG. 20
• Tabulação pode ser utilizada.

• Palavras reservadas SQL não podem ser quebradas entre linhas.

• Os comandos SQL podem ser escritos em maiúsculo ou minúsculo.

• Quando um comando SQL é entrado, as subsequentes linhas são


numeradas. Este é o buffer do SQL.

• Somente um comando pode estar contido no SQL buffer. Este


comando pode ser executado das seguintes formas:

♦ Colocando “;” no final.

♦ Colocando “;” ou “/” na última linha.

♦ Colocando “/” no prompt do SQL.

♦ Executando o comando RUN no prompt do SQL.

 Qualquer um dessas sentenças são válidas:

SQL> SELECT * FROM emp;

SQL> SELECT
2 *
3 FROM
4 emp

Paulo André
PÁG. 21
5;

SQL> SELECT *
2 FROM emp;

Paulo André
PÁG. 22
II.4 - CRIAÇÃO DE TABELAS

 O que é uma tabela?

Nome da coluna Coluna Linha ou (registro)

EMP ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

Campos

Paulo André
PÁG. 23
 Para criar a tabela de empregados:

SQL> CREATE TABLE emp (


2 empno number(4) not null, “,” separa as definições
3 ename char(10), das colunas
4 job char(10),
5 mgr number(4),
6 hiredate date,
7 sal number(10,2), “;” executa o comando
8 comm number(10,2),
9 deptno number(2));

Indica a continuação do comando

somente o cabeçalho

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

II.5 - INCLUINDO NOVAS LINHAS EM UMA TABELA

 O comando INSERT é usado para inserir linhas em uma tabela.


Paulo André
PÁG. 24
 Sintaxe:

INSERT INTO table


schema. View @dblink

VALUES ( expr )
,

( column ) subquery_2

Onde:

schema é o schema contendo a tabela ou visão. Se


você omitir o eschema, o Oracle assume a
tabela ou visão como seu próprio dono.
table, view é o nome da tabela no qual as linhas serão
inseridas. Se você especificar uma visão, o
Oralce insere linhas na tabela que a visão
baseia-se.
dblink é o nome completo ou parcial de um link de
banco de dados para um banco de dados
remoto onde a tabela ou visão está localizada.
Se você omitir dblink, o Oracle assume que a
tabela ou visão está em um banco de dados
local.
column é uma coluna da tabela ou visão. Na linha
inserida, cada coluna nesta lista está atribuída
a um valor na cláusula VALUES ou a
subconsulta.
VALUES Especifica uma linha de valores a serem
inseridos na tabela ou visão.
subsquery_2 é uma sub-consulta que retorna linhas que
são inseridas na tabela. A lista selecionada
desta consulta tem que ter o mesmo número
de colunas da lista do comando INSERT.

 Caracteres e datas devem sempre estar entre aspas simples.

 Para você inserir linhas em uma tabela, a tabela tem que ser sua ou
você tem que ter privilégios sobre ela.

Paulo André
PÁG. 25
 O privilégio de sistema INSERT ANY TABLE também permite a você
inserir linhas em qualquer tabela de qualquer usuário.

 Para inserir informações na tabela EMP.

SQL> INSERT INTO emp VALUES


2 (7369, ’SMITH’, ’CLERCK’, 7902,
3 ‘17-DEC-80’, 800, NULL, 20);

SQL> INSERT INTO emp VALUES


2 (7566, ‘JONES’, ‘MANAGER’, 7839, ‘02-APR-81’,
3 2975, NULL, 20);

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTN


O
7369 SMITH CLERK 7902 17-DEC-80 800 20
7566 JONES MANAGER 7839 02-APR-81 2975 20

 Duas formas para inserir informações na tabela EMP.

SQL> INSERT INTO emp


2 (ename, empno, job, mgr, hiredate, sal, deptno)
3 VALUES (‘SAMANTA’, 103, ‘ANALISTA’, 110, sysdate-30,
4 1500, 20);

ou

SQL> INSERT INTO emp


2 VALUES (103, ‘SANTANA’, ‘ANALISTA’, 110, sysdate-30,
3 15000, NULL, 20);

 É possível incluir uma nova linha com valores atribuídos para cada
coluna, neste caso os nomes das colunas podem ser omitidos. Recomenda-se que
a lista de colunas seja sempre especificada.

 O comando abaixo insere um registro na tabela dept.

INSERT INTO dept (deptno, dname, loc)


VALUES (99,’Financeiro’, ‘Curitiba’);

Paulo André
PÁG. 26
 O exemplo abaixo insere um linha na tabela DEPT.

INSERT INTO dept


VALUES (50, ’PRODUCAO’, ‘MARINGA’)

 O exemplo abaixo insere uma linha com seis colunas na tabela EMP.
Uma dessas colunas está atribuída com valor nulo e outra está atribuída com
notação científica.

INSERT INTO emp (empno, ename, job, sal, comm, deptno)


VALUES (7890, ‘JINKS’, ‘CLERK’, 1.2E3, NULL, 40)

 O comando abaixo inclue uma coluna de cada vez. Utilizando variáveis


para substituição, é possível aumentar a velocidade de entrada de informações.

INSERT INTO dept (deptno, dname, loc)


VALUES (&dept_num, ‘&dept_nome’, ‘&localizacao’);

 Quando este comando for executado, os valores para as variáveis


serão pedidos.

 Exemplo:

SQL> INSERT INTO salgrade (losal, hisal, grade)


2 SELECT min(sal), max(sal), substr(sal, 1,1)
3 FROM emp
4 GROUP BY substr(sal, 1,1);

INSERT INTO func_dept_10


(empno, ename, sal, job, hiredate)
SELECT empno, ename, sal, job, hiredate
FROM emp
WHERE deptno = 10;

Paulo André
PÁG. 27
II.6 - ALTERANDO LINHAS DE UMA TABELA

 O comando UPDATE é usado para alterar valores já armazenados em


tabelas.

 Para você atualizar linhas em uma tabela, a tabela tem que ser sua ou
você tem que ter privilégios sobre ela.

 O privilégio de sistema UPDATE ANY TABLE também permite a você


alterar linhas em qualquer tabela de qualquer usuário.

 Sintaxe:

UPDATE

,
table

schema. View @dblink t_alias

snapshot

( subquery_1 )

,
,

SET ( column ) = ( subquery_2 )

column = expr

( subquery_3 )

WHERE condição

Paulo André
PÁG. 28
Onde:

schema é o schema contendo a tabela ou visão. Se


você omitir o schema, o Oracle assume a
tabela ou visão como seu próprio dono.
table, view é o nome da tabela no qual está sendo
atualizada. Se você especificar uma visão, o
Oralce atualiza na tabela que a visão baseia-
se.
dblink é o nome completo ou parcial de um link de
banco de dados para um banco de dados
remoto onde a tabela ou visão está localizada.
Se você omitir dblink, o Oracle assume que a
tabela ou visão está em um banco de dados
local.
alias é um nome diferente para a tabela, visão ou
subconsulta para ser referenciada no
comando.
subquery_1 é uma subconsulta que o oracle trata da
mesma maneira que uma visão.
column é o nome de uma coluna para a tabela ou
visão que está sendo atualizada. Se você
omitir a coluna da tabela na cláusula SET, o
valor da coluna permanece inalterado.
expr é o novo valor atribuído a coluna
correspondente.
subquery_2 é uma subconsulta que retorna novos valores
que são atribuídos para colunas
correspondentes.
subquery_3 é uma subconsulta que retorna um novo valor
que está atribuído a coluna correspondente.
where restrição para atualizar as linhas. Se essa
cláusula for omitida, o Oracle atualiza todas as
linhas na tabela ou visão.

 O comando abaixo fornece ao SCOTT a profissão de VENDEDOR e


um aumento de salário de 10%.

Paulo André
PÁG. 29
UPDATE emp
SET job = ‘VENDEDOR’,
sal = sal * 1.1
WHERE ename = ‘SCOTT’;

 O exemplo abaixo transforma para nulo as comissões de todos os


empregados que tenham como cargo SALESMAN.

UPDATE emp
SET comm = NULL
WHERE job = ‘SALESMAN’;

 Para colocar R$1000,00 de comissão para o funcionário de número


7499.

SQL> UPDATE emp


2 SET comm = 1000
3 WHERE empno = 7499;

 Para dobrar o salário de todos empregados do departamento 20 e


transferí-los para o departamento 30.

SQL> UPDATE emp


2 SET sal = 2 * sal, deptno = 30
3 WHERE deptno = 20;

 Para atualizar o salário do funcionário 7902;

EMPNO ENAME … SAL …


7902 FORD 3000

SQL> UPDATE emp


2 SET sal = 3500
3 WHERE empno = 7902;

EMPNO ENAME … SAL …


7902 FORD 3500

 Para dar 10% de aumento para os funcionários que trabalham no


departamento 10.

Paulo André
PÁG. 30
SQL> UPDATE emp
2 SET sal = sal*1.10
3 WHERE deptno = 10;

 O comando abaixo promove JONES a gerente do departamento 20


com um salário de R$ 1000,00. (Assumindo que tenha somente um Jones).

SQL> UPDATE emp


2 SET job = ‘MANAGER’, sal = sal + 1000, deptno = 20
3 WHERE ename = ‘JONES’;

II.7 - REMOVENDO LINHAS DE UMA TABELA

 O comando DELETE é usado para remover linhas de uma tabela:

 Sintaxe:
Paulo André
PÁG. 31
DELETE table

FROM schema. View @dblink

( subquery )

WHERE condição

Onde:

schema é o schema contendo a tabela ou visão. Se você


omitir o schema, o Oracle assume a tabela ou visão
como seu próprio dono.
table, view é o nome da tabela no qual está sendo apagado as
linhas. Se você especificar uma visão, o Oralce
apaga linhas da tabela que a visão baseia-se.
dblink é o nome completo ou parcial de um link de banco
de dados com um banco de dados remoto onde a
tabela ou visão está localizada. Se você omitir o
dblink o Oracle7 assume que a tabela ou visão está
localizada em um banco de dados local.
subquery é uma sub-consulta no qual os dados são
selecionados para serem apagados. O Oracle
executa uma subconsulta e usa o resultado das
linhas como uma tabela na cláusula FROM.
WHERE apaga somente linhas que satisfaçam a condição. A
condição pode referenciar a tabela e pode conter
uma sub-consulta.

 Para você apagar linhas em uma tabela, a tabela tem que ser sua ou
você tem que ter privilégios sobre ela.

 O privilégio de sistema DELETE ANY TABLE também permite a você


apagar linhas em qualquer tabela de qualquer usuário.

 Para remover o empregado de número 7369.

SQL> DELETE FROM emp WHERE empno = 7369;

 Para remover todos os empregados do departamento 20.

Paulo André
PÁG. 32
SQL> DELETE FROM emp WHERE deptno = 20;

 Para remover todos os empregados.

SQL> DELETE from emp;

 Para remover o empregado de número 7934:

SQL> DELETE FROM emp


2 WHERE empno = 7934;

 Para remover todos os empregados admitidos a partir de 1989:

SQL> DELETE FROM emp


2 WHERE hiredate >= ‘01-JAN-89’;

 O comando abaixo apaga todos empregados da tabela EMP que


tenham profissão SALESMAN e comissão menor do que R$100,00.

SQL> DELETE FROM emp


2 WHERE job = ‘SALESMAN’
3 AND comm < 100;

II.8 - O COMANDO TRUNCATE

 O comando TRUNCATE é usado para remover todas as linhas de uma


tabela:

Paulo André
PÁG. 33
TRUCANTE {TABLE | CLUSTER} tabela
[ {DROP | REUSE} STORAGE]

>> tabela Nome da tabela de onde serão removidas as linhas

 Observações:

• A opção DROP STORAGE libera o espaço físico alocado à tabela para o banco de
dados.

• O comando TRUNCATE não dispara os gatilhos de deleção.


• Não é possível executar o comando TRUNCATE sobre uma tabela referenciada por
outra qualquer.

 Exemplos:

• Para remover as linhas da tabela EMP, liberando seu espaço físico:

SQL> TRUNCATE TABLE emp DROP STORAGE;

II.9 - EDIÇÃO DE COMANDOS

 O último comando SQL (não SQL*Plus) fica armazenado no buffer de


edição do SQL*Plus.

 Para listar o conteúdo do buffer:

SQL> list
qualquer um desses comandos
ou pode ser utilizado

Paulo André
PÁG. 34
SQL> l
1 SELECT
2 empno, ename
3 FROM emp
4* WHERE empno = 7902

“*” indica a linha corrente

 Para apagar a linha corrente

SQL> del
SQL> l
1 SELECT
2 empno, ename
3* FROM emp

 Para inserir linhas após a linha corrente:

SQL> list 2
2* empno, ename
SQL> imput

ou

SQL> list deixe um linha em branco


3 job, para terminar a inserção
4 sal
5

SQL> list

Paulo André
PÁG. 35
1 SELECT
2 empno, ename
3 job,
4 sal
5* FROM emp;

 Para acrescentar caracteres no fim da linha corrente:

SQL> list 2
2* empno, ename
SQL> append, mgr,
ou
SQL> a, mgr,
SQL> list
1 SELELCT
2 empno, ename, mgr,
3 job,
4 sal
5* FROM emp;

 Para substituir caracteres da linha corrente:

SQL> list 2
2* empno, ename, mgr,
SQL> change/mgr/sal/

ou

SQL> c/mgr/sal/
SQL> list
1 SELECT
2 empno, ename, sal,
3 job,
4 sal
5* FROM emp
Paulo André
PÁG. 36
 Para executar o comando existente no buffer:

SQL> run

ou

SQL> r

ou

SQL> /

 O SQL*Plus permite a utilização de outros buffers além do buffer de


comandos SQL.

 Para ativar um buffer chamado “TESTE”, por exemplo:

SQL> set buffer teste

 Para saber qual é o buffer corrente:

SQL> show buffer


buffer TESTE

 Para modificar o conteúdo do buffer corrente com um editor externo:

SQL> edit

 O editor externo pode ser especificado pelo usuário da seguinte forma:

SQL> define _editor = vi

 Para salvar o buffer corrente num arquivo do Sistema Operacional:

SQL> save arquivo

nome do arquivo; a extensão .sql é


acrescentada automaticamente

Paulo André
PÁG. 37
 Para recuperar um comando SQL armazenado num arquivo:

SQL> get arquivo

 Para remover o conteúdo do buffer corrente:

SQL> clear buffer

 Para executar uma seqüência de comandos (SQL ou SQL*Plus)


armazenada num arquivo:

SQL> start arquivo

ou

SQL> @arquivo

 Para editar um arquivo qualquer do sistema operacional:

SQL> edit ex21

é assumida a extensão “.sql”

II.10 - OUTROS COMANDOS

 Para executar um comando qualquer do sistema operacional:

SQL> host is - al

ou

SQL> ! Is - al

total 20

drwxr-xr-x 2 curso oracle 128 Jan 3 18:02 .


drwxr-xr-x 3 curso oracle 1024 Jan 3 17:59 ..
-rw-r—r—1 curso oracle 800 Jan 3 17:59 ex21.sql
-rw-r—r—1 curso oracle 838 Jan 3 17:59 ex22.sql
-rw-r—r—1 curso oracle 1152 Jan 3 18:01 ex23.sql
-rw-r—r—1 curso oracle 1616 Jan 3 18:01 ex24.sql
-rw-r—r—1 curso oracle 1796 Jan 3 18:01 ex25.sql

Paulo André
PÁG. 38
 Para obter ajuda sobre um comando SQL ou SQL*Plus:

SQL> help select

nome do comando

 Para saber todos os comandos disponíveis:

SQL> help commands

II.11 - EXERCÍCIOS

1. Crie uma tabela chamado “ALUNO” com as seguintes colunas:

NOME CHAR(30) NOT NULL


ENDER CHAR(50)
CIDADE CHAR(25)
ESTADO CHAR(2)
CEP NUMBER(5)
ANIVERSÁRIO DATE

2. Insira dados sobre você e algum membro da sua família na tabela ALUNO.

3. Consulte o nome e a data de aniversário das pessoas cadastradas.

4. Consulte o seu (e somente o seu) endereço completo.

Paulo André
PÁG. 39
5. Salve o comando anterior no arquivo “ex24.sql”, saia do SQL*Plus, entre
novamente e execute o comando contido no arquivo gerado.

6. Dobrar o salário do funcionário de número 7566.

7. Remover os empregados que possuem comissão maior que o próprio


salário.

III - CONSULTAS BÁSICAS

Paulo André
PÁG. 40
III.1 - CONTEÚDO

1. Seleção de colunas

2. Uso de expressões

3. Ordenação de resultados

4. Agrupamento

5. Operações de conjunto

6. Junção de tabelas

Paulo André
PÁG. 41
III.2 - SELEÇÃO DE COLUNAS

 A sentença do comando SELECT recupera as informações do Banco


de Dados implementando todos os operadores da Álgebra Relacional.

 Uma pesquisa simples deve conter:

• A cláusula SELECT que selecionará as colunas que serão exibidas. Os


nomes das colunas devem estar separados por vírgula.

• A cláusula FROM que especifica as tabelas envolvidas.

 Para você selecionar dados de uma tabela ou snapshot, a tabela ou o


snapshot tem que ser sua ou você tem que ter privilégios sobre ela.

 O privilégio de sistema SELECT ANY TABLE também permite a você


selecionar linhas em qualquer tabela de qualquer usuário.

Paulo André
PÁG. 42
 Sintaxe:

SELECT *
,
DISTINCT
ALL table .*
schema. View
snapshot
expr

c_alias
AS
,

FROM table

schema. View @dblink t_alias WHERE condição

snapshot

CONNECT BY condição UNION comando


SELECT

START WITH condição UNION ALL

, INTERSECT

GROUP BY expr MINUS

HAVING condição

Paulo André
PÁG. 43
,
ORDER BY expr

position ASC

c_alias DESC

Onde:

DISTINCT retorna somente uma cópia de cada linha


selecionada que for duplicada.
ALL retorna todas as linhas selecionadas,
incluindo as duplicadas. O default é ALL.
* select todas as colunas de todas as tabelas.
table.*, view.*, snapshot.* seleciona todas as colunas da tabela, visão
ou snapshot. Você pode usar o schema para
selecionar de uma tabela, visão ou snapshot
em um outro schema.
expr seleciona uma expressão.
c_alias provê um nome diferente para a coluna.
schema é o schema contendo a tabela, visão ou
snapshot. Se você omitir o schema, o Oracle
assume a tabela, visão ou snapshot como
seu próprio dono.
table, view, snapshot é o nome da tabela, visão ou snapshot no
qual está sendo selecionado.
dblink é o nome completo ou parcial para um link de
banco de dados com um banco de dados
remoto onde a tabela, visão ou snapshot está
localizada.
t_alias provê um nome diferente para a tabela, visão
ou snapshot ou subconsulta.
WHERE restringe as linhas selecionadas. Se você
omitir esta cláusula, o Oracle retorna todas
as linhas da tabela, visão ou snapshot.
START WITH, retorna linhas em uma ordem hierárquica.
CONNECT BY
GROUP BY função de grupo
HAVING restringe os grupos de cada linha retornada
Paulo André
PÁG. 44
no GROUP BY.
UNION, UNION ALL, combina as linhas retornadas por dois
INTERSECT, MINUS comandos SELECT usando uma operação
de função.

ORDER BY ordena as linhas retornadas por um


comando.
Expr ⇒ ordena linhas baseadas no valor de
expr. A expressão é baseada em
colunas na lista selecionada ou
colunas em tabelas, visões ou
snapshots na cláusula FROM.
Position ⇒ ordena linhas baseado em seus
valores para a expressão na posição da lista
selecionada.
ASC, DESC ⇒ especifica a ordenação
ascendente ou descendente. O opção ASC é
default.

 O comando abaixo mostra o número do departamento, nome e


número do patrão da tabela EMP.

SELECT deptno, ename, mgr


FROM emp;

DEPTNO ENAME MGR


----------- ------------------------- ------------
10 SMITH 7902
30 ALLEN 7698
30 WARD 7698
20 JONES 7839
30 BLAKE 7839
10 CLARK 7839
20 SCOTT 7566
10 KING
30 TURNER 7698
20 ADAMS 7788
30 JAMES 7698
20 FORD 7566
10 MILLER 7782
Paulo André
PÁG. 45
 Para recuperar as informações da tabela EMP:

SQL> SELECT * FROM emp;

EMP ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

 O comando abaixo seleciona linhas dos empregados que trabalham no


departamento 30.

SQL> SELECT *
2 FROM emp
3 WHERE deptno = 30;

 A ordem em que as colunas são especificadas muda a apresentação


do resultado:

SQL> SELECT ename, empno


2 FROM emp
3 WHERE empno < 7500;

ENAME EMPNO
SMITH 7369
ALLEN 7499
Paulo André
PÁG. 46
 Para indicar as colunas a serem recuperadas de uma tabela:

SQL> SELECT empno, ename


2 FROM emp
3 WHERE empno < 7500;

EMPNO ENAME
7369 SMITH
7499 ALLEN

Paulo André
PÁG. 47
III.3 - OPERADORES ARITMÉTICOS

Os operadores aritméticos são utilizados para somar, subtrair, multiplicar e


dividir valores numéricos. Os operadores de maior precedência, os parênteses,
conforme pode ser observado na tabela seguinte, permite alterar a ordem de
avaliação dos operadores das expressões. Esta tabela lista os operadores
aritméticos na ordem decrescente de precedência:

( ) Alteram as regras de precedência dos operadores. Os operadores entre


os parênteses são avaliados em primeiro lugar.

SELECT (2+2) / (2-1) from dual;

+ - Assinalam uma expressão como positiva ou negativa.

SELECT * FROM EMP WHERE COMM = -10


SELECT * FROM EMP WHERE SAL > 1000

* / Multiplicam e dividem valores numéricos.

SELECT 2*X+10
... WHERE X > Y / 2

+ - Somam e subtraem valores numéricos.

SELECT 2 * X + 1
... WHERE X > Y - Z

Paulo André
PÁG. 48
III.4 - USO DE EXPRESSÕES

 Para saber o salário anual dos empregados

ENAME JOB SAL


SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
TURNER SALESMAN 1500
ADAMS CLERK 1100
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300

SQL> SELECT ename, 12 * sal FROM emp;

ENAME 12*SAL
SMITH 9600
ALLEN 19200
WARD 15000
JONES 35700
MARTIN 15000
BLAKE 34200
CLARK 29400
SCOTT 36000
KING 60000
TURNER 18000
ADAMS 13200
JANES 11400
FORD 36000
MILLER 15600

 Para saber o número total de caracteres nas colunas ENAME e JOB:


Paulo André
PÁG. 49
ENAME JOB SAL
SMITH CLERK 800
ALLEN SALESMAN 1600
WARD SALESMAN 1250
JONES MANAGER 2975
MARTIN SALESMAN 1250
BLAKE MANAGER 2850
CLARK MANAGER 2450
SCOTT ANALYST 3000
KING PRESIDENT 5000
TURNER SALESMAN 1500
ADAMS CLERK 1100
JAMES CLERK 950
FORD ANALYST 3000
MILLER CLERK 1300

sinônimo para a
coluna

SQL> SELECT
2 length (ename) +
3 length(job) “Comprimento Total”
4 FROM emp;

Comprimento Total
10
13
12
12
14
12
12
12
13
14
10
10
11
11

Paulo André
PÁG. 50
III.5 - OPERADORES DE CARACTERES

 Os operadores de caracteres são usados em expressões para


manipular strings de caracter. A seguir o único tipo de operador de caracter:

|| Faz a concatenação de strings de caracteres, ou seja, encadeiam ou


ligam duas strings.

SELECT ´O Nome é´ || ename from emp

 O resultado da concatenação é um valor caracter. As strings de


caracteres dos tipos de dados CHAR podem ter o máximo de 255 caracteres. Esta
restrição aplica-se também às strings de caracteres formadas pela concatenação de
duas outras strings.

Paulo André
PÁG. 51
 Para saber os nomes dos empregados que trabalham no
departamento 20.

EMP ENAME JOB ... DEPTNO


7369 SMITH CLERK ... 20
7499 ALLEN SALESMAN ... 30
7521 WARD SALESMAN ... 30
7566 JONES MANAGER ... 20
7654 MARTIN SALESMAN ... 30
7698 BLAKE MANAGER ... 30
7782 CLARK MANAGER ... 10
7788 SCOTT ANALYST ... 20
7839 KING PRESIDENT ... 10
7844 TURNER SALESMAN ... 30
7876 ADAMS CLERK ... 20
7900 JAMES CLERK ... 30
7902 FORD ANALYST ... 20
7934 MILLER CLERK ... 10

SQL> SELECT ename


2 FROM emp
3 WHERE deptno = 20;

ENAME
SMITH
JONES
SCOTT
ADAMS
FORD

Paulo André
PÁG. 52
 Para saber o tempo de serviço dos funcionários cuja comissão é maior
que 50% do salário:

SQL> SELECT ename,


2 months_between(sysdate, hiredate) MESES
3 FROM emp
4 WHERE comm > sal * 0.50;

ENAME MESES
MARTIN 187.5371

Paulo André
PÁG. 53
III.6 - OPERADORES DE COMPARAÇÃO

 Os operadores de comparação são usados em condições que


comparam duas expressões. Assim como as condições, os resultados das
comparações entre expressões podem ser verdadeiro ou falso. A tabela a seguir
lista os operadores de comparação:

() Alteram as regras de validação das precedências dos


operadores.

SELECT (SAL + COMM)/2 from emp;

= Testa a igualdade entre expressões.

SELECT * FROM EMP WHERE SAL = 1000;

!= ^= <> Testam a diferença entre expressões.

SELECT * FROM EMP WHERE SAL <> 1000;

> Testa se uma expressão é maior que outra.

SELECT * FROM EMP WHERE SAL > 1000

< Testa se uma expressão é menor que outra.

SELECT * FROM EMP WHERE SAL < 1000

>= Testa se uma expressão é maior ou igual a outra.

SELECT * FROM EMP WHERE SAL >= 1000

<= Testa se uma expressão é menor ou igual a outra.

SELECT * FROM EMP WHERE SAL <= 1000

IN Verifica se um expressão existe em um dos membros


especificados entre parênteses logo após o operador. Esses
membros são strings de caracteres que devem aparecer entre
Paulo André
PÁG. 54
aspas simples e separados por vírgula. O operador é equivalente
ao operador “=ANY”.

SELECT * FROM EMP WHERE JOB IN


(´SALESMAN´,´CLERK´)

NOT IN Valida a expressão como falsa se algum membro que segue o


operador é nulo. Esses membros são os valores retornados de
uma pesquisa efetuada com SELECT, por exemplo. É
equivalente a “!= ALL”. Todas as linhas serão avaliadas como
falso se qualquer membro da lista de valores referenciada pelo
operador NOT IN for nulo.

SELECT * FROM EMP WHERE JOB NOT IN


(´SALESMAN´,´CLERK´)

NOT BETWEEN Validam uma expressão como sendo maior ou igual ao valor que
- AND segue BETWEEN e menor ou igual ao valor que segue AND.

NOT LIKE Este operador é usado para comparar duas strings de caracteres
e verificar se elas são parecidas.
• Podem ser utilizados caracteres % e _ . O caracter
percentual (%) é utilizado para comparar um ou mesmo
nenhum caracter, entretanto não pode comparar um valor
nulo. O caracter sublinhado (_) é utilizado para comparar
exatamente um caracter.
• Função UPPER: utilizada para fazer com que as
expressões sejam avaliadas corretamente comparando letras
minúsculas e maiúsculas.

... SELECT SAL


FROM EMP

IS NOT NULL Este operador deve ser usado quando for necessário testar uma
condição para verificar se ela é nula ou não.

... WHERE X IS NOT NULL

III.7 - OPERADORES LÓGICOS

Paulo André
PÁG. 55
 Os operadores lógicos são usados para afetar o resultado de múltiplas
condições. O operador AND requer que a linha satisfaça todas as duas condições
comparadas. Pôr sua vez, o operador OR requer que a linha satisfaça pelo menos
uma das duas condições comparadas.

SELECT * FROM emp


WHERE (hiredate < ´01-JAN-93´ ) AND (sal < 1000)

 O comando select abaixo mostra o nome, cargo, salário e


departamento de todos os empregados, exceto os que possuem cargo SALESMAN
e trabalham no departamento 10.

SELECT ename, job, sal, deptno


FROM EMP
WHERE NOT(job = ‘SALESMAN’ AND deptno = 30)

Paulo André
PÁG. 56
III.8 - OUTROS OPERADORES

(+) Indica que a coluna precedida pelo sinal (+) está relacionada à
coluna anterior da declaração e faz parte de outra tabela. Este
operador é utilizado para especificar os relacionamentos entre as
colunas.

...WHERE DEPT.DEPTNO = EMP.DEPTNO (+)

* Seleciona todas as colunas das tabelas em uma pesquisa.

SELECT * FROM EMP


SELECT EMP.* FROM EMP

COUNT(X) Retorna o número de linhas onde a expressão X não é nula.

SELECT COUNT(DEPTNO) FROM EMP

ALL Retém os valores duplicados em pesquisas.

SELECT ALL * ...


COUNT( ALL DEPTNO)

DISTINCT Elimina as linha duplicadas do resultado de uma pesquisa ou


elimina os valores em duplicidade de uma expressão.

SELECT DISTINCT * ...


COUNT(DISTINCT DEPTNO)

PRIOR Define a relação entre as colunas das tabelas em uma pesquisa. A


expressão que segue o operador PRIOR representa a linha da
tabela principal. A outra expressão que se segue à anterior
representa a linha com a qual se efetua o relacionamento.

CONNECT BY PRIOR EMPNO =


LEVEL_EBN

III.9 - SUBSTITUIÇÃO DE VARIÁVEIS

Paulo André
PÁG. 57
 Você pode utilizar variáveis nos arquivos de comandos ou nos
comandos SQL para representar valores que serão entrados em tempo de
execução.

 Uma variável começa sempre com o caracter & e é sempre


temporária. Para definir uma variável permanente deve-se utilizar &&.

 Pegar o número do departamento em tempo de execução.

SELECT empno, ename, sal


FROM emp
WHERE deptno = &numero_departamento;

Enter value from numero_departamento:

 Se a variável for do tipo caracter, deve-se entrar com a informação


entre aspas simples.

 Exemplo:

SELECT ename, sal


FROM emp
WHERE ename = ‘&nome_do_funcionario’;

III.10 - ORDENAÇÃO DE RESULTADOS

 Normalmente a ordem das colunas resultantes de uma pesquisa é


indefinida. A cláusula ORDER BY pode ser utilizada para organizar as linhas. Se
usada, ela sempre deve ser a última cláusula da sentença do SELECT.
Paulo André
PÁG. 58
ASC Parâmetro default, ordena o resultado da pesquisa pelas
colunas especificada na ordem ascendente.

DESC Ordena o resultado da pesquisa pelas colunas


especificada na ordem decrescente.

 O comando abaixo retorna o nome, salário multiplicado por 12 e


número do departamento em ordem alfabética.

SELECT ename, job, sal * 12, deptno


FROM emp
ORDER BY ename;

 Para listar os funcionários em ordem alfabética:

SQL> SELECT ename, job, sal


2 FROM emp
3 ORDER BY ename;

ENAME JOB SAL


ADAMS CLERK 1100
ALLEN SALESMAN 1600
BLAKE MANAGER 2850
CLARK MANAGER 2450
FORD ANALYST 3000
JAMES CLERK 950
JONES MANAGER 2975
KING PRESIDENT 5000
MARTIN SALESMAN 1250
MILLER CLERK 1300
SCOTT ANALYST 3000
SMITH CLERK 800
TURNER SALESMAN 1500
WARD SALESMAN 1250

 Para listar os empregados em ordem descrescente de salário, por


cargo.

SQL> SELECT ename, job, sal


2 FROM emp
3 WHERE job in (‘ANALYST’, ‘SALESMAN’,
4 ‘MANAGER’)

Paulo André
PÁG. 59
5 ORDER BY job, sal desc;

ENAME JOB SAL


SCOTT ANALYST 3000
FORD ANALYST 3000
JONES MANAGER 2975
BLAKE MANAGER 2850
CLARK MANAGER 2450
ALLEN SALESMAN 1600
TURNER SALESMAN 1500
WARD SALESMAN 1250
MARTIN SALESMAN 1250

 Pode-se usar expressões ou referências à posição de expressões no


SELECT como argumentos do ORDER BY:

SQL> SELECT ename, job, length(job), sal


2 FROM emp
3 WHERE job in (‘ANALYST’, ‘SALESMAN’,
4 ‘MANAGER’)
5 ORDER BY 3, sal + nvl(comm,0) desc;

Paulo André
PÁG. 60
III.11 - A CLÁUSULA WHERE

 A cláusula WHERE corresponde ao operador Restriction da Álgebra


Relacional. Ela contém a condição às quais efetuarão comparações nas linhas para
serem exibidas.

 A cláusula WHERE quando utilizada, deve estar logo após a cláusula


FROM.

 A cláusula WHERE pode comparar valores às colunas, valores literais,


expressões aritméticas ou funções utilizando os operadores mencionados.

 O comando abaixo mostra todos os empregados que trabalha no


departamento 30.

SELECT *
FROM emp
WHERE deptno = 30;

 O comando abaixo seleciona o nome, cargo, salário e número do


departamento dos empregados, exceto os vendedores que trabalham no
departamento 30.

SELECT ename, job, sal, deptno


FROM emp
WHERE not (job = ‘SALESMAN’ and deptno = 30);

III.12 - CLÁUSULA GROUP BY

Paulo André
PÁG. 61
 A cláusula GROUP BY pode ser usada para dividir as linhas de uma
tabela em pequenos grupos. Funções de grupos podem ser utilizadas para retornar
uma informação sumarizada de cada grupo.

SELECT job, avg(sal)


FROM emp
GROUP BY job;

 Com essa cláusula pode-se também agrupar linhas dentro de grupos.

SELECT job, deptno, avg(sal)


FROM emp
GROUP BY deptno, job;

 O comando abaixo retorna o menor e maior salário de cada


departamento.

SELECT deptno, min(sal), max(sal)


FROM emp
GROUP BY deptno;

 O comando abaixo retorna o menor e maior salário para os


funcionários que tem como profissão CLERK, por departamento.

SELECT deptno, min(sal), max(sal)


FROM emp
WHERE job = ‘CLERK’
GROUP BY deptno;

 Para saber quantos funcionários trabalham em cada departamento.

EMP ENAME JOB MGR HIREDATE SAL COMM DEPTNO


Paulo André
PÁG. 62
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

coluna do agrupamento todas as linhas

SQL> SELECT deptno, count(*)


2 FROM emp função de grupo
3 GROUP BY deptno;

DEPTNO COUNT(*)
10 3
20 5
30 6

 Nota: Omitir a cláusula “GROUP BY” significa agrupar toda a tabela.

III.13 - CLÁUSULA HAVING

 Se quiser especificar quais grupos serão exibidos, utilize a cláusula


HAVING.

Paulo André
PÁG. 63
SELECT deptno, avg(sal)
FROM emp
GROUP BY deptno
HAVING count (*) > 3;

 É recomendado que a cláusula GROUP BY venha antes da cláusula


HAVING.

 O comando abaixo retorna o menor e maior salário para os


funcionários que tem como profissão CLERK por departamento, tendo o menor
salário menor do que 1000.

SELECT deptno, min(sal), max(sal)


FROM emp
WHERE job = ‘CLERK’
GROUP BY deptno
HAVING min(sal) < 1000;

 Para saber a soma dos salários para os cargos onde a média de


salários é maior que 1500:

EMPNO ENAME JOB ... SAL ...


7788 SCOTT ANALYST ... 3000 ... AVG = 3000
7902 FORD ANALYST ... 3000 ...
7369 SMITH CLERK ... 800 ... AVG = 1037.5
Paulo André
PÁG. 64
7876 ADAMS CLERK ... 1100 ...
7934 MILLER CLERK ... 1300 ...
7900 JAMES CLERK ... 950 ...
7566 JONES MANAGER ... 2975 ... AVG = 2758.3
333
7782 CLARK MANAGER ... 2450 ...
7698 BLAKE MANAGER ... 2850 ...
7839 KING PRESIDENT ... 5000 ... AVG = 5000
7499 ALLEN SALESMAN ... 1600 ... AVG = 1400
7654 MARTIN SALESMAN ... 1250 ...
7844 TURNER SALESMAN ... 1500 ...
7521 WARD SALESMAN ... 1250 ...

SQL> SELECT job, sum(sal), max(sal)


2 FROM emp
3 GROUP BY job
4 HAVING avg(sal) > 1500;

selecione os grupos
(“where” de grupo) função de grupo

JOB SUM(SAL) MAX(SAL)


ANALYST 6000 3000
MANAGER 8725 2975
PRESIDENT 5000 5000

III.14 - OPERAÇÕES DE CONJUNTO

 Uma tabela pode ser encarada como um conjunto

 Os elementos do conjunto são as linhas da tabela:

Tabela

Paulo André
PÁG. 65
Col. 1 Col. 2
A 1
B 1
D 2

(A,1)
elementos
(B,1) do
conjunto
(D,2)

Conjunto

 Existem três operações básicas de conjunto em SQL:

• União (UNION)

• Intersecção (INTERSECT)

• Diferença (MINUS)

 União

TABELAS

Col1 Col2 Col1 Col2


A 1 A 2
B 1 B 1
D 2 E 2

Paulo André
PÁG. 66
D 2

colunas com tipo igual

select col1, col2 from tab1

union

select col1, col2 from tab2

Col1 Col2
A 1
A 2
B 1
D 2
E 2

 Intersecção

TABELAS

Col1 Col2 Col1 Col2


A 1 A 2
B 1 B 1
D 2 E 2
D 2

Paulo André
PÁG. 67
colunas com tipo igual

select col1, col2 from tab1

intersect

select col1, col2 from tab2

Col1 Col2
B 1
D 2

 Diferença

Col1 Col2 Col1 Col2


A 1 A 2
B 1 B 1
D 2 E 2
D 2

colunas com tipo igual

Paulo André
PÁG. 68
select col1, col2 from tab1

minus

select col1, col2 from tab2

Col1 Col2
A 1

III.15 - JUNÇÃO DE TABELAS

 Um Join é uma consulta que combina linhas de duas ou mais tabelas,


visões ou snapshots. O Oracle7 executa um join quando múltiplas tabelas aparecem
na cláusula FROM.

 A lista selecionada da coluna pode conter qualquer coluna de qualquer


tabela. Caso haja colunas com o mesmo nome, você tem que especificar de qual
tabela é a determinada coluna.

 A junção de tabelas corresponde à operação de produto cartesiano


entre conjuntos:

A,
B, C X 1,2
Paulo André
PÁG. 69
(A,1), (A,2),

(B,1), (B,2),

(C,1), (C,2)

tab1 tab2
col1 col2 col3 col4 col5
A 3 B 2 E

select col1, col2, col3, col4, col5


from tab1, tab2;

col1 col2 col3 col4 col5


A 3 B 2 E

 Para saber o nome do departamento onde cada empregado trabalha:

produto cartesiano

SQL> SELECT ename, dname


2 FROM emp, dept
3 WHRE emp.deptno = dept.deptno; critério de seleção da
junção

para diferenciar colunas de


mesmo nome usa-se o no-
me da tabela como prefixo

ENAME DNAME
SMITH RESEARCH
ALLEN SALES
WARD SALES
JONES RESEARCH
Paulo André
PÁG. 70
MARTIN SALES
BLAKE SALES
CLARK ACCOUNTING
SCOTT RESEARCH
KING ACCOUNTING
TURNER SALES
ADAMS RESEARCH
JAMES SALES
FORD RESEARCH
MILLER ACCOUNTING

ENAME DEPTNO EMP.DEPTNO DEPT.DEPTNO


SMITH ACCOUNTING 20 10
ALLEN ACCOUNTING 30 10
WARD ACCOUNTING 30 10
JONES ACCOUNTING 20 10
MARTIN ACCOUNTING 30 10
BLAKE ACCOUNTING 30 10
CLARK ACCOUNTING 10 10
SCOTT ACCOUNTING 20 10
KING ACCOUNTING 10 10
TURNER ACCOUNTING 30 10
ADAMS ACCOUNTING 20 10
JAMES ACCOUNTING 30 10
FORD ACCOUNTING 20 10
MILLER ACCOUNTING 10 10
SMITH RESEARCH 20 20
ALLEN RESEARCH 30 20
WARD RESEARCH 30 20
JONES RESEARCH 20 20
MARTIN RESEARCH 30 20
BLAKE RESEARCH 30 20
CLARK RESEARCH 10 20
SCOTT RESEARCH 20 20
KING RESEARCH 10 20
Paulo André
PÁG. 71
TURNER RESEARCH 30 20
ADAMS RESEARCH 20 20
JAMES RESEARCH 30 20
FORD RESEARCH 20 20
MILLER RESEARCH 10 20
SMITH SALES 20 30
ALLEN SALES 30 30
WARD SALES 30 30
JONES SALES 20 30
MARTIN SALES 30 30
BLAKE SALES 30 30
CLARK SALES 10 30
SCOTT SALES 20 30
KING SALES 10 30
TURNER SALES 30 30
ADAMS SALES 20 30
JAMES SALES 30 30
FORD SALES 20 30
MILLER SALES 10 30
SMITH OPERATIONS 20 40
ALLEN OPERATIONS 30 40
WARD OPERATIONS 30 40
JONES OPERATIONS 20 40
MARTIN OPERATIONS 30 40
BLAKE OPERATIONS 30 40
CLARK OPERATIONS 10 40
SCOTT OPERATIONS 20 40
KING OPERATIONS 10 40
TURNER OPERATIONS 30 40
ADAMS OPERATIONS 20 40
JAMES OPERATIONS 30 40
FORD OPERATIONS 20 40
MILLER OPERATIONS 10 40

 Dada a tabela salgrade, que classifica faixas de salários:

GRADE LOSAL HISAL


1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999

 Para saber a faixa salarial de todos os empregados:

SQL> SELECT ename, sal, grade


2 FROM emp, salgrade
3 WHERE sal between losal and hisal;

especifica um tipo
de junção

Paulo André
PÁG. 72
ENAME SAL GRADE
SMITH 800 1
ADAMS 1100 1
JAMES 950 1
WARD 1250 2
MARTIN 1250 2
MILLER 1300 2
ALLEN 1600 3
TURNER 1500 3
JONES 2975 4
BLAKE 2850 4
CLARK 2450 4
SCOTT 3000 4
FORD 3000 4
KING 5000 5

 Pode-se combinar diversas opções no mesmo comando SQL:

SQL> SELECT dname, grade, count(*)


2 FROM emp, dept, salgrade
3 WHERE emp.deptno = dept.deptno and
4 sal between losal and hisal
5 GROUP BY dname, grade
6 HAVING sum(sal) > 1200
7 ORDER BY dname, count(*) DESC;

DNAME GRADE COUNT(*)


ACCOUNTING 2 1
ACCOUNTING 4 1
ACCOUNTING 5 1
RESEARCH 4 3
RESEARCH 1 2
SALES 2 2
SALES 3 2
SALES 4 1

Paulo André
PÁG. 73
 O comando abaixo retorna o nome e cargo do empregado e o número
do e nome do departamento

SQL> SELECT ename, dept.deptno, dname


2 FROM emp, dept
3 WHERE emp.deptno = dept.deptno;

 O comando abaixo retorna o nome, cargo e número do departamento


dos empregados e nome do departamento de todos os funcionários CLERKS.

SQL> SELECT ename, job, dept.deptno, dname


2 FROM emp, dept
3 WHERE emp.deptno = dept.deptno
4 AND job = ‘CLERK’;

III.16 - EXERCÍCIOS

1. Consulte o nome, o local do departamento, o salário por hora (assumindo


160 horas/mês) e o total mensal (salário + comissão) dos vendedores da tabela
EMP. Salve seu exercício no arquivo “ex31.sql”.

2. Carregue o conteúdo do arquivo “ex31.sql” no buffer corrente e modifique-


o de forma a ordenar o resultado em ordem descrescente do salário por hora. Salve
seu exercício novamente, no mesmo arquivo.

3. Descubra o menor salário de todos os empregados.

4. Obtenha a soma dos salários dos empregados que não trabalham nos
departamentos 10 ou 30.

5. Obtenha o nome e a média salarial dos departamentos (exceto o 10), cujo


maior salário seja inferior a 4000.
Paulo André
PÁG. 74
6. Obtenha a média de salário para cada faixa salarial.

IV - CONSULTAS AVANÇADAS

Paulo André
PÁG. 75
IV.1 - CONTEÚDO

1. Pseudo - colunas

2. Junção externa

3. Auto-Junção

4. Consultas encaixadas

5. Consultas hierárquicas

Paulo André
PÁG. 76
IV.2 - PSEUDO-COLUNAS

 Pseudo-colunas são colunas que podem ser consultadas em qualquer


tabela, como uma coluna normal, mas não podem ser alteradas:

T Nome Descrição
N nome_seq.CURRVAL Valor corrente da sequência nome_seq
N nome_seq.NEXTVAL Próximo valor da sequência nome_seq
N LEVEL Usada no comando SELCT … CONNECT
BY; é igual a 1 para o nó raíz de uma
árvore, 2 para seus filhos e assim por
diante
- NULL Valor nulo
R ROWID Identificação interna de uma linha
N ROWNUM Número que indica a ordem de seqüência
da linha selecionada em uma consulta

SQL> SELECT rownum, rowid


2 FROM dual;

tabela com uma única linha e


uma única coluna

Paulo André
PÁG. 77
ROWNUM ROWID
1 00000984.0001.0001

IV.3 - JUNÇÃO EXTERNA

 Para listar o nome de todos departamentos e seus respectivos


empregados:

SQL> SELECT dept.deptno, dname, empno, ename


2 FROM dept, emp
3 WHERE dept.deptno = emp.deptno order by dept.deptno;

DEPTNO DNAME EMPNO ENAME


10 ACCOUNTING 7782 CLARK
10 ACCOUNTING 7839 KING
10 ACCOUNTING 7934 MILLER
20 RESEARCH 7369 SMITH
20 RESEARCH 7876 ADAMS
20 RESEARCH 7902 FORD
20 RESEARCH 7788 SCOTT
20 RESEARCH 7566 JONES
30 SALES 7499 ALLEN
30 SALES 7698 BLAKE
30 SALES 7654 MARTIN
30 SALES 7900 JAMES
30 SALES 7844 TURNER
30 SALES 7521 WARD

PROBLEMA: Departamento 40 nao aparece,


pois nao tem empregados

Paulo André
PÁG. 78
ENAME DEPTNO EMP.DEPTNO DEPT.DEPTNO
SMITH ACCOUNTING 20 10
ALLEN ACCOUNTING 30 10
WARD ACCOUNTING 30 10
JONES ACCOUNTING 20 10
MARTIN ACCOUNTING 30 10
BLAKE ACCOUNTING 30 10
CLARK ACCOUNTING 10 10
SCOTT ACCOUNTING 20 10
KING ACCOUNTING 10 10
TURNER ACCOUNTING 30 10
ADAMS ACCOUNTING 20 10
JAMES ACCOUNTING 30 10
FORD ACCOUNTING 20 10
MILLER ACCOUNTING 10 10
SMITH RESEARCH 20 20
ALLEN RESEARCH 30 20
WARD RESEARCH 30 20
JONES RESEARCH 20 20
MARTIN RESEARCH 30 20
BLAKE RESEARCH 30 20
CLARK RESEARCH 10 20
SCOTT RESEARCH 20 20
KING RESEARCH 10 20
TURNER RESEARCH 30 20
ADAMS RESEARCH 20 20
JAMES RESEARCH 30 20
FORD RESEARCH 20 20
MILLER RESEARCH 10 20
SMITH SALES 20 30
ALLEN SALES 30 30
WARD SALES 30 30
JONES SALES 20 30
MARTIN SALES 30 30
BLAKE SALES 30 30
CLARK SALES 10 30
SCOTT SALES 20 30
KING SALES 10 30
TURNER SALES 30 30
ADAMS SALES 20 30
JAMES SALES 30 30
FORD SALES 20 30
MILLER SALES 10 30
SMITH OPERATIONS 20 40
ALLEN OPERATIONS 30 40
Paulo André
PÁG. 79
WARD OPERATIONS 30 40
JONES OPERATIONS 20 40
MARTIN OPERATIONS 30 40
BLAKE OPERATIONS 30 40
CLARK OPERATIONS 10 40
SCOTT OPERATIONS 20 40
KING OPERATIONS 10 40
TURNER OPERATIONS 30 40
ADAMS OPERATIONS 20 40
JAMES OPERATIONS 30 40
FORD OPERATIONS 20 40
MILLER OPERATIONS 10 40
Não existem empregados no departamento 40
 Solução: fazer de conta que existe uma linha fictícia, totalmente nula,
na tabela de empregados, para que ela seja associada à linha do departamento 40
(junção externa):

SQL> SELECT dept.deptno, dname, empno, ename


2 FROM dept, emp
3 WHERE dept.deptno = emp.deptno(+);

operador opcional para junção


externa

DEPTNO DNAME EMPNO ENAME


10 ACCOUNTING 7782 CLARK
10 ACCOUNTING 7839 KING
10 ACCOUNTING 7934 MILLER
20 RESEARCH 7369 SMITH
20 RESEARCH 7876 ADAMS
20 RESEARCH 7902 FORD
20 RESEARCH 7788 SCOTT
20 RESEARCH 7566 JONES
30 SALES 7499 ALLEN
30 SALES 7698 BLAKE
30 SALES 7654 MARTIN
30 SALES 7900 JAMES
30 SALES 7844 TURNER
30 SALES 7521 WARD
40 OPERATIONS

 Para saber os departamentos sem empregados:

SQL> SELECT dept.deptno, dname, loc


2 FROM dept, emp
3 WHERE dept.deptno = emp.deptno(+) and empno is null;

Paulo André
PÁG. 80
DEPTNO DNAME LOC
40 OPERATIONS BOSTON

IV.4 - AUTO - JUNÇÃO

 As tabelas envolvidas numa junção não precisam ser distintas.

 Para descobrir quais gerentes estão ganhando menos que o dobro do


salário de algum de seus subordinados:

pseudônimos para tabelas

SQL> SELECT ger.ename gerente, ger.sal, max(2*trab.sal)


2 FROM emp trab, emp ger
3 WHERE trab.mgr = ger.empno
4 GROUP BY ger.ename, ger.sal
5 HAVING max(2*trab.sal) > ger.sal;

GERENTE SAL MAX(2*TRAB.SAL)


BLAKE 2850 3200
CLARK 2450 2600
JONES 2975 6000
KING 5000 5950
.

SQL> SELECT e1.ename||’TRABALHA PARA’|| e2.ename “EMPREGADOS”


2 FROM emp e1, emp e2 where
3 e1.mgr = e2.empno;

Paulo André
PÁG. 81
IV.5 - CONSULTAS ENCAIXADAS

 Uma subquery é um comando SELECT que está contido em um outro


comando SELECT.

 O comando que contém a subconsulta é chamado de comando pai. As


linhas retornadas pela subconsulta são usadas pelo comando pai.

 Subqueries podem:

• Retornar uma ou mais linhas.


• Retornar uma ou mais colunas.
• Utilizar funções de grupos ou GROUP BY.
• Agrupar tabelas.

 Uma sub-consulta pode fazer referências a colunas do comando no


qual ela está encaixada.

SELECT coluna1, coluna2,...


FROM tabela
WHERE coluna = ( SELECT coluna
FROM tabela
WHERE condicao )

 Para saber quais empregados ganham mais que a média dos salários:

SQL> SELECT empno, ename, sal parenteses delimitam a


2 FROM emp sub-consulta
3 WHERE sal > (select avg(sal) from emp);
resultado desta sub-consulta é
um único valor

Paulo André
PÁG. 82
 Para saber quais funcionários trabalham com o SCOTT.

SQL> SELECT ename, deptno


2 FROM emp
3 WHERE deptno = (SELECT deptno FROM emp where ename =
‘SCOTT’);

 Para saber os departamentos que não tem empregados:

operador de exclusão
de conjunto

SQL> SELECT deptno, dname elimina os valores duplicados


2 FROM dept
3 WHERE deptno not in (SELECT distinct deptno FROM emp);

esta sub-consulta retorna


um conjunto de valores

DEPTNO DNAME
40 OPERATONS

 Encontre o funcionário com maior salário.

SELECT ename, job


FROM EMP
WHERE sal = ( SELECT max(sal) FROM emp);

 Encontre os funcionários com maior salário em cada departamento.

SELECT ename, job, deptno


FROM emp
WHERE sal IN (SELECT max(sal) FROM emp
GROUP BY deptno);

Paulo André
PÁG. 83
 Para recuperar os empregados que ganham mais que a média de
salário do seu departamento:

SQL> SELECT deptno,ename, sal nesse caso é necessário o


2 FROM emp x pseudônimo para a tabela
3 WHERE sal > (SELECT avg(sal) FROM emp y
4 where x.deptno = y.deptno )
5 ORDER BY deptno ;

DEPTNO ENAME SAL


10 KING 5000
20 JONES 2975
20 SCOTT 3000
20 FORD 3000
30 ALLEN 1600
30 BLAKE 2850

 Para saber se o resultado de uma sub-consulta é vazio ou não


equivalente ao IS NOT NULL para colunas:

SQL > SELECT ename, job, deptno só importa se uma linha


2 FROM emp x existe ou não
3 WHERE exists (SELECT ‘x’ from emp y
4 WHERE x.empno = y.mgr)

 Sub-consultas também podem ser usadas nos comandos de


manipulação de dados (INSERT, UPDATE, DELETE).

 Para eliminar os empregados mais novos de cada departamento:

SQL> DELETE FROM emp e


2 WHERE hiredate = (SELECT max(hiredate) FROM emp
3 WHERE deptno = e.deptno);

Paulo André
PÁG. 84
 Para que todos os empregados mais novos de cada cargo ganhem o
melhor salário e a média das comissões de seu cargo:

SQL> UPDATE emp e


2 SET (sal,comm) = (SELECT max(sal), avg(comm) FROM emp
3 WHERE job = e.job)
4 WHERE hiredate = (SELECT max(hiredate) FROM emp
5 WHERE job = e.job);

Paulo André
PÁG. 85
IV.6 - CONSULTAS HIERÁRQUICAS

 Oracle permite recuperar informações estruturadas de forma


hierárquica (“em árvore”):

 Você pode selecionar linhas em uma ordem hierárquica usando as


seguintes cláusulas

START WITH você pode especificar linha(s) pai de uma hierarquia.


CONNECT BY você pode especificar o relacionamento entre linhas pais e
linhas filhas de uma hierarquia.
WHERE você pode restringir as linhas retornadas pela consulta sem
afetar outras linhas da hiearquia.

 A cláusula START WITH identifica a(s) linha(s) a ser(em) usada(s)


como raiz(es) de uma consulta hierárquica. Esta cláusula especifica uma condição
que a raiz tem que satisfazer. Se você omitir essa cláusula, o Oracle7 usa todas as
linhas na tabela como linhas raiz.

 A cláusula CONNECT BY especifica o relacionamento entre linhas


pais e filhas na consulta hierárquica. Esta cláusula contém uma condição que define
este relacionamento. Alguma parte da condição tem que usar o operador PRIOR
para se referir a linha pai.

 Para encontrar o filho de uma linha pai, o Oracle7 executa a expressão


PRIOR para a linha pai e a outra expressão para cada linha na tabela. Linhas para o
qual a condição é verdadeira são filhas.

 Se a cláusula CONNECT BY resultar em um loop na hierarquia, o


Oracle7 retorna um erro. Um loop ocorre se uma linha é pai e filha de uma outra
linha

 A seguinte cláusula CONNECT BY define um relacionamento


hierárquico no qual o valor EMPNO da linha pai seja igual ao valor do MGR da linha
filha.

CONNECT BY PRIOR empno = mgr

Paulo André
PÁG. 86
75 / PRESIDENTE

110 / DIRETOR 230 / SECRETÁRIA 189 / DIRETOR

103 / ANALISTA 276 / ANALISTA 201 / VENDEDOR 208/VENDEDOR

EMP ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

 Para saber todos os superiores do SCOTT:

SQL> SELECT empno, ename, job


2 FROM emp indica o sentido da consulta:
3 WHERE ename <> ‘SCOTT’ do empregado para o chefe
4 CONNECT BY empno = PRIOR mgr
5 START WITH ename = ‘SCOTT’;

especifica a conexão da indica o começo da


coluna consulta

EMPNO ENAME JOB


7566 JONES MANAGER
7839 KING PRESIDENT

Paulo André
PÁG. 87
 Para saber o nome do Presidente e de seus subordinados, exceto
aqueles que são também subordinados de JONES:

SQL> SELECT empno, ename, job


2 FROM emp
3 CONNECT BY PRIOR empno = mgr AND mgr <> 7566
4 START WITH job = ‘PRESIDENT’;

Elimina toda uma


sub-árvore

EMPNO ENAME JOB


7839 KING PRESIDENT
7566 JONES MANAGER
7698 BLAKE MANAGER
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7654 MARTIN SALESMAN
7844 TURNER SALESMAN
7900 JAMES CLERK
7782 CLARK MANAGER
7934 MILLER CLERK

 Podemos usar uma pseudo-coluna LEVEL para saber o nível de cada


registro na hierarquia:

Paulo André
PÁG. 88
SQL> SELECT level, lpad(‘ ’,2*level ) | | ename nome
2 FROM emp
3 CONNECT BY PRIOR empno = mgr
4 START WITH job = ‘PRESIDENT’;

LEVEL NOME
1 KING
2 JONES
3 SCOTT
4 ADAMS
3 FORD
4 SMITH
2 BLAKE
3 ALLEN
3 WARD
3 MARTIN
3 TURNER
3 JAMES
2 CLARK
3 MILLER

IV.7 - EXERCÍCIOS

1. Consulte os nomes dos funcionários que são chefes de alguém.


Paulo André
PÁG. 89
2. Consulte o nome dos chefes (MOME_CHEFE) dos funcionários
(ENAME) da tabela EMP, ordenados por NOME_CHEF. Caso algum funcionário não
possua chefe, mostre a cadeia de caracteres ‘___________’ em NOME_CHEFE.

3. Consulte os nomes e salários dos funcionários que estão na mesma


faixa salarial que seus chefes.

4. Aumente o salário em 20% para os empregados que sejam os mais


antigos de seus departamentos.

5. Promova a diretor os empregados que recebem mais que a média dos


salários de seus cargos.

6. Desfaça as duas operações anteriores.

7. Faça com que os empregados passem a ganhar o maior salário dentre


os companheiros da mesma faixa.

8. Desfaça a operação anterior.

Paulo André
PÁG. 90
VI - ESTRUTURA DE DADOS

VI.1 - ESTRUTURA DE DADOS ORACLE

 Tabelas podem ser criadas a qualquer hora, mesmo que o Banco de


Dados esteja sendo utilizado.

 O tamanho dos dados são variáveis, somente são armazenados os


caracteres e números. Os espaços em branco não são armazenados.
Paulo André
PÁG. 91
 Não há necessidade de especificar o tamanho de alguma tabela. Isto é
definido pelo espaço determinado para o Banco de Dados. Mas é importante
sempre verificar o tamanho das tabelas.

 As estruturas das tabelas podem ser modificas quando estão em uso.

Paulo André
PÁG. 92
VI.2 - CRIANDO UMA TABELA

 O nome escolhido para a tabela deve sempre seguir as regras básicas


de nomenclatura dos objetos do Banco de Dados ORACLE.

1. O nome sempre deve começar com letra (A - Z)

2. Pode-se utilizar letras, números e caracteres especiais

3. O nome da tabela não é sensível a letras maiúsculas e minúsculas

4. Deve ter no máximo 30 caracteres

5. Não pode existir duas tabelas, visões ou sinônimos para um mesmo


usuário com o mesmo nome

6. O nome da tabela não pode ser uma palavra reservada do SQL

Paulo André
PÁG. 93
VI.3 - DIRETRIZES PARA CRIAÇÃO DE NOMES DE TABELAS

 Utilize nomes auto-descritivos para tabelas, colunas, índices ou outros


objetos.

 Cuidado com as abreviações e o uso de singular e plural nos nomes


das tabelas.

 Crie padrões para nomear os objetos. Ex.: tabela de notas fiscais -


nota_fiscal.

 Utilize os mesmos nomes definidos para as entidade-atributos para


descreverem a tabela-coluna relacionada.

Paulo André
PÁG. 94
VI.4 - TIPOS DE COLUNAS

 Quando criar uma tabela, você deve especificar os tipos das colunas.
Os mais utilizados são:

CHAR (n) Valores tipo CHAR consistem em palavras compostas por


letras minúsculas e maiúsculas, números e caracteres
especiais. O número de caracteres é especificado por n e
não pode ser maior que 255. Não usa armazenamento
dinâmico.

VARCHAR2(n) São valores tipo CHAR com no máximo 2000 posições. Usa
armazenamento dinâmico.

NUMBER (n,m) São valores numéricos (0 - 9) e caracteres de sinal (+ -) e


ponto decimal. n são números inteiros e m são decimais.
Usa armazenamento dinâmico.

DATE São valores tipo data. Ex.: December 31, 4712 BC. Usa 7
bytes.

LONG Similar ao tipo CHAR, mas aceita a quantidade de


caracteres acima de 65.535. Só pode ser definida uma
coluna LONG por tabela.

Paulo André
PÁG. 95
VI.5 - A OPÇÃO NULL E NOT NULL

NULL Esta opção define que a coluna pode possuir valores nulos.
Esta opção é default e pode ser omitida.

NOT NULL Esta opção assegura que a coluna sempre tenha valores
diferentes de nulo. Se tentar incluir uma linha com a coluna
que tem essa opção sem valor, o ORACLE enviará uma
mensagem de erro.

Paulo André
PÁG. 96
VI.6 - CLÁUSULA CONSTRAINT

 O Banco de Dados Oracle suporta documentação para integridade


armazenando informações sobre verificação de integridade no dicionário de dados.
Uma Constraint de integridade é uma regra que define um relacionamento entre
tabelas de um banco de dados. Por exemplo, uma constraint de integridade pode
definir que um funcionário não esteja contido em dois ou mais departamentos.

 Uma constraint pode ser definida para tabelas e colunas e são


definidas no comando CREATE ou ALTER TABLE.

 O objetivo de uma constraint é definir um intervalo de valores válidos.


Para que os comandos INSERT, UPDATE e DELETE sejam executados com
sucesso, devem obedecer as regras de constraint estabelecidas.

 A utilização de constraint possibilita definir as seguintes regras para


uma ou mais colunas:

• Restringir uma coluna ou mais a valores diferentes de nulo (NOT


NULL).

• Definir que o valor da coluna seja único na tabela (UNIQUE)


• Identificar a coluna como coluna chave da tabela (PRIMARY KEY)
• Estabelecer restrições a chaves estrangeiras (FOREIGN KEY)
• Verificar se o valor de uma ou mais colunas estão de acordo com uma
expressão (CHECK).

 Existem dois tipos de constraints:

Paulo André
PÁG. 97
• Constraints de tabela
• Constraints de coluna
 Estes tipos são idênticos, a não ser que as constraint de coluna
refereciem a uma coluna enquanto a de tabela refereciem a uma ou mais colunas
da tabela.

 Definição da constraint da tabela:

CREATE TABLE assignment


( projeto number (4) ,
funcionario number(4),
PRYMARY KEY ( projeto, funcionario);

 Definição da constraint da coluna:

CREATE TABLE emp (


EMPNO NUMBER (4) NOT NULL CONSTRAINT EMPNO
PRIMARY KEY,
ENAME VARCHAR(10) CHECK (ENAME = UPPER (ENAME) ) ,
JOB VARCHAR(10) ,
MGR NUMBER (4) CONSTRAINT EMP_MGR
REFERENCES EMP (EMPNO),
HIREDATE DATE CHECK (HIREDATE <= SYSDATE),
SEG_NUM VARCHAR(12) UNIQUE CONTRAINT EMP_SEG ,
SAL NUMBER (7,2) ,
COMM NUMBER (7,2) ,
DEPTNO NUMBER (2) NOT NULL CONSTRAINT EMP_DEPT
REFERENCES DEPT(DEPTNO)
);

Paulo André
PÁG. 98
VI.7 - PARÂMETROS DA CONSTRAINT

CONSTRAINT Define o nome da constraint. Este parâmetro é


nome_da_constraint opcional. Se não definir o nome da constraint, ela
receberá um nome default no formato SYS_Cn, onde n
é um inteiro e único identificador da constraint.

NULL/NOT NULL Define se a coluna pode ou não conter valores nulos. O


default é que pode conter ( NULL).

UNIQUE Certifica que cada linha da tabela terá um valor


diferente para a coluna. Esta coluna tem que ser
definida como NOT NULL e não pode ser a chave
primária.

PRIMARY KEY Define que a coluna é a única identificação de cada


linha. Esta coluna tem que ser NOT NULL e não pode
ter o UNIQUE constraint.

FOREIGN KEY ( coluna ...)/ Identifica que essa é uma chave estrangeira da tabela
REFERENCES do usuário definida. Deve sempre estar referenciada a
usuário.tabela(colunas) uma tabela e não a uma visão.

CHECK Define a condição que deve ser satisfeita para que a


coluna possa ser incluída ou alterada numa linha da
tabela.

VI.8 - CREATE TABLE

Paulo André
PÁG. 99
 O comando CREATE TABLE é usado para criar novas tabelas no
banco de dados.

 Sintaxe:

CREATE TABLE table


schema.

( coluna tipo )

DEFAULT expr column_constraint

table_constraint

AS subquery

Obs: Sintaxe abreviada.

Onde:

Schema É o schema contendo a tabela. Se você omitir


o schema, o Oracle cria a tabela como seu
Paulo André
PÁG. 100
próprio dono.
Table É o nome da tabela a ser criada.
Coluna Especifica o nome de uma coluna da tabela.
Uma tabela não pode ter mais do que 254
colunas.
Tipo É o tipo da coluna.
Default Especifica um valor a ser atribuído para a
coluna se um comando INSERT subsequente
for omitido para o valor da coluna. O tipo da
expressão tem que ser o mesmo tipo da
coluna.
Column_constraint Define uma integridade de constraint como
parte da definição da coluna.
Table_constraint Define uma integridade de constraint como
parte da definição da tabela.
As subquery Insere as linhas retornadas por uma
subconsulta na tabela que será criada.

 Criando a tabela DEPT.

CREATE TABLE dept


(deptno number (2) NOT NULL,
dname char (12),
loc varchar2 (12)) ;

Paulo André
PÁG. 101
 Criando a tabela EMP.

SQL> CREATE TABLE emp


2 (empno number(4) PRIMARY KEY,
3 ename char(10) NOT NULL,
4 job char(10),
5 mgr number(4) REFERENCES emp(empno),
6 hiredate data DEFAULT sysdate
7 CHECK (hiredate <=
sysdate),
8 sal number(10,2),
9 comm number(10,2) CHECK(comm > 0),
10 deptno number(2) REFERENCES
dept(deptno));

 Verificando a estrutura criada na tabela

DESCRIBE EMP;

Name Null Type


--------------------------------------------- --------------- ------
EMPNO NOT NULL NUMBER (4)
ENAME CHAR (10)
JOB CHAR (9)
MGR NUMBER (4)
HIREDATE DATE
SAL NUMBER (7,2)
COMM NUMBER (7,2)
DEPTNO NOT NULL NUMBER (2)

VI.9 - CRIAR UMA TABELA COM BASE EM UMA JÁ EXISTENTE

 A tabela será criada com as colunas especificadas e as linhas


resultantes do comando SELECT serão inseridas na nova tabela.

 As especificações das colunas podem ser omitidas se no comando


SELECT foram especificadas.

Paulo André
PÁG. 102
 O número de colunas no comando SELECT deve ser igual ao do
comando CREATE TABLE.

CREATE TABLE dept10


AS
SELECT empno, ename, job, sal
FROM emp
WHERE deptno = 10;

Table created.

• Exemplo:

SQL> CREATE TABLE sal_medio AS


2 SELECT dname, avg(sal) “Media_Salarial”
3 FROM dept, emp
4 WHERE emp.deptno = dept.deptno
5 GROUP BY dname;

SQL> SELECT * FROM sal_medio;

DNAME Media_Salario
ACCOUNTING 2916.6667
RESEARCH 2175
SALES 1566.6667

Paulo André
PÁG. 103
VI.10 - ALTERAÇÃO DE UMA TABELA

 Restrições para a alteração da estrutura de uma tabela:

• Só é possível diminuir o tamanho de uma coluna, ou mudar seu tipo, se todos os


valores desta coluna forem nulos;

• Só é possível alterar o tipo de uma coluna para “NOT NULL” se nenhum dos seus
valores for nulo;

• Não é possível remover uma coluna de uma tabela com o comando ALTER TABLE.
Para conseguir este efeito deve-se criar outra tabela sem a coluna a ser removida.
Por exemplo, para apagar a coluna DIRETOR:

SQL> CREATE TABLE dep_temp AS


2 SELECT deptno, dname, loc
3 FROM dept;

SQL> DROP TABLE dept;

SQL> RENAME dep_temp TO dept;

VI.11 - ALTERANDO UMA TABELA

Paulo André
PÁG. 104
 O comando ALTER TABLE serve para alterar a estrutura de uma
tabela.

 O parâmetro ADD deve ser utilizado para adicionar uma coluna e/ou
constraint para uma tabela existente.

ALTER TABLE table


schema.

ADD ( column_datatype )
DEFAULT exp column_constraint
table_constraint
,

MODIFY ( column )
datatype DEFAULT expr column_contraint

Obs: Sintaxe abreviada.

 Onde:

Table é o nome da tabela a ser alterada.


Paulo André
PÁG. 105
ADD adiciona uma coluna ou integridade de
constraint.
MODIFY modifica a definição de uma coluna existente.
Column é o nome da coluna a ser alterada ou
modificada.
Datatype especifica um tipo para a coluna ou um novo
tipo para uma coluna existente.
DEFAULT especifica um valor default para uma nova
coluna ou um novo valor default para uma
coluna existente. O Oracle assume esse valor
para a coluna se um comando INSERT
subsequence omitir um valor para a coluna. O
tipo de um valor default tem que ser igual ao
tipo especificado para a coluna. A expressão
DEFAULT não pode conter referências a
outras colunas.
Column_constraint adiciona ou remove uma constraint NOT NULL
para ou de uma coluna existente.
Table_constraint adiciona uma integridade de constraint para a
tabela.

 O comando abaixo adiciona a coluna NOME_DA_ESPOSA na tabela EMP.

ALTER TABLE EMP


ADD( nome_da_esposa CHAR (10));

Paulo André
PÁG. 106
 O comando abaixo adiciona a constraint CHECK na coluna SAL da tabela
EMP.

ALTER TABLE EMP


ADD(CHECK(sal <= 5000));

 O comando abaixo modifica a coluna ENAME da tabela EMP para o tamanho


de 25 posições.

ALTER TABLE EMP


MODIFY (ename char(25));

VI.12 - O COMANDO RENAME

 O comando RENAME server para alterar o nome dos objetos de uma


banco de dados.

Paulo André
PÁG. 107
RENAME OLD TO NEW ;

 Todos os objetos de banco de dados relacionados terão que ser


alterados.

 Exemplo: Aplicações, programas, relatórios.

 Para mudar o nome de uma tabela:

 O exemplo abaixo troca o nome da tabela EMP para FUNCIONARIO.

RENAME EMP TO FUNCIONÁRIO;

 O exemplo abaixo troca o nome da tabela NOME_FUN para


NOME_FUNCIONARIO.

RENAME NOME_FUN TO NOME_FUNCIONARIO;

 O exemplo abaixo troca o nome da tabela DEPT para


DEPARTAMENTO.

SQL> rename dept to departamento;

VI.13 - DROP TABLE

 Sintaxe:

DROP TABLE table


schema. CASCADE CONSTRAINTS
Paulo André
PÁG. 108
 Onde:

schema é o esquem em que a tabela está contida. Se


você omitir o schema, o Oracle Server assume
que o dono da tabela é o schema corrente.
table é o nome da tabela a ser apagada.
CASCADE apaga todas as constraints de integridade
CONSTRAINTS referencial que se refere à chave primária e/ou
única na tabela a ser apagada. Se você omitir
esta opção, e existir constraint de integridade
referencial, o Oracle Server retorna uma
mensagem de erro e não apaga a tabela.

 O comando DROP TABLE serve para remover a definição de uma


tabela.

DROP TABLE emp;

 Quando uma tabela é eliminada, todos os dados e os índices


associados também serão removidos.

• Todos os dados serão removidos


• Todas as visões (VIEWS) e sinônimos (SYNONYMS) permanecerão,
mas ficarão inválidas.

• Todas as transações pendentes serão gravadas.


• Somente o dono da tabela ou o DBA pode removê-la.

VI.14 - ELIMINANDO CONSTRAINT DA TABELA

 Para eliminar constraint de uma tabela, deve-se utilizar o parâmetro


DROP.

ALTER TABLE emp


DROP CONSTRAINT emp_seg;

Paulo André
PÁG. 109
VI.15 - DOCUMENTANDO UMA TABELA

 O Comando COMMENT inclui um comentário de no máximo 255


caracteres sobre a tabela ou coluna no dicionário de dados.

 Adicionando um comentário em uma tabela:

COMMENT ON TABLE emp IS ‘Informações sobre Funcioários’;

Paulo André
PÁG. 110
 Adicionando um comentário em uma coluna:

COMMENT ON COLUMN emp.empno IS ‘Identificador do Funcionário’;

 Eliminando um comentário:

COMMENT ON COLUMN emp.empno;

 Para visualizar os comentários, eles estão armazenados nas seguintes


visões (VIEWS) do dicionário de dados: ALL_COL_COMMENTS ou
USER_COL_COMMENTS.

Paulo André
PÁG. 111

You might also like