Você está na página 1de 48

tema3

SQL – DML e DDL


Neste tema abordaremos a linguagem padrão
de acesso ao banco de dados (SQL), enfatizan-
do de forma mais específica as linguagens de
definição de dados (Data Definition Languague
– DDL) e de manipulação de dados (Data Mani-
pulation Language – DML).

Visando exemplificar de forma prática e objeti-


va a linguagem em estudo adotaremos o SGBD
Oracle Express Edition (Oracle XE) e a ferra-
menta de acesso ao banco de dados Oracle SQL
Developer.
3.1
INTRODUÇÃO AO SGBD ORACLE E SQL

Os sistemas gerenciadores de banco de dados são acessados


através de uma linguagem de programação padrão conhecida como
Structured Query Language, ou SQL. Esta linguagem foi projetada
para acessar banco de dados relacionais e proporciona aos desenvol-
vedores os seguintes recursos:

DD Consulta a dados: através de sentenças SQL (denominadas


queries) – As consultas em SQL são escritas utilizando o co-
mando SELECT, que veremos nos próximos conteúdos;

DD Inclusão, atualização e exclusão de dados: através da lin-


guagem de manipulação de dados (DML) – Verificaremos
que estas operações podem ser executadas através dos co-
mandos INSERT, UPDATE, DELETE;

DD Criação, alteração e exclusão de tabelas do banco de dados:


Realizada através das sentenças pertinentes a linguagem de
definição de dados (DDL) – São exemplos de sentenças DDL:

• CREATE: possibilita criação da estrutura da base;

• ALTER: permite modificar a estrutura dos objetos base de


dados;

• DROP: efetua a exclusão de objetos do banco de dados;

• RENAME: permite modificar o nome de uma tabela;

• TRUNCATE: apaga todas as linhas de uma tabela;


116
Banco de Dados I

DD Controle de acesso ao banco de dados e as suas tabelas:


realizado através da linguagem de controle de dados (Data
Control Language – DCL). Os comandos definidos por esta
linguagem são:

• GRANT: permite que um usuário tenha acesso a uma de-


terminada tabela;

• REVOKE: efetua o papel inverso da cláusula GRANT;

Atualmente a linguagem SQL é padronizada por um institu-


to internacional denominado American National Standards Institute
(ANSI) e cada fabricante dos diversos sistemas gerenciadores de ban-
co de dados seguem a este padrão definindo o seu nível de aderência.

A primeira versão do SQL foi desenvolvida pela IBM em meados de


1970, entretanto a primeira versão comercial do SQL foi disponibilizada
apenas em 1979 através de uma empresa chamada Relational Softwa-
re Inc. – Hoje conhecida como Oracle Corporation. Esta empresa possui
hoje um dos principais SGBD do mercado, o Oracle Database, que utili-
zaremos como base do aprendizado SQL. Veremos agora detalhes deste
SGBD para que possamos estar aptos a utilizá-lo no nosso estudo.

Arquitetura do Banco de Dados Oracle


Um banco de dados Oracle é composto por duas entidades: ins-
tância e banco de dados. A instância é formada pelas estruturas em
memória e os processos. O banco de dados (database) consiste nos
arquivos persistidos em disco.
117
Tema 3
SQL – DML e DDL

No cenário convencional, denominada Single-Instance, cada


instância está diretamente relacionada a um único banco de dados
armazenado em um ou vários discos locais. A instância e o banco de
dados obrigatoriamente devem estar no mesmo computador nes-
te modelo de arquitetura. Existem outros cenários mais complexos,
onde várias instâncias podem ser distribuídas em vários servidores e
interligadas a único banco de dados. Este cenário é conhecido como
Oracle Real Application Clusters (RAC). No site oficial da Oracle (www.
oracle.com) você terá mais informações sobre esta tecnologia.

Independentemente do modelo de arquitetura do banco de dados


Oracle, costumamos dizer que o tempo de vida da instância ocorre so-
mente em memória, ou seja, só existe quando toda sua estrutura é car-
regada na memória RAM (Randomic Acess Memory) do computador.

A comunicação entre o computador cliente e o SGBD Oracle se-


gue o padrão cliente/servidor, usualmente utilizando o protocolo de
comunicação TCP/IP. Para acesso ao banco de dados o usuário deve
ter conhecimento do nome ou endereço IP do servidor e nome da ins-
tância do banco de dados instalado. Nas próximas seções veremos
detalhes sobre a instalação do Oracle Express Edition e o cliente para
acesso ao banco de dados Oracle Sql Developer.

Arquitetura Oracle Single-Instance


118
Banco de Dados I

A aplicação cliente, a exemplo do Oracle Sql Developer, cria o


processo do usuário, denominado User Process, que através de uma
rede local ou da internet comunica-se com um processo servidor, de-
nominado Server Process. O evento de estabelecer uma conexão en-
tre um processo de usuário e um processo de servidor é denominado
Sessão.

O processo servidor é responsável por receber toda e qualquer


solicitação do computador cliente e estabelecer a comunicação com a
instância do banco de dados.

O SGBD Oracle realiza o mapeamento lógico dos arquivos físi-


cos (database files) para o seu nível conceitual através dos elementos
chamados tablespaces. Cada tablespace pode estar mapeada a um
ou vários arquivos de dados. Quando uma tabela é criada, ela deve
ser associada a uma tablespace e consequentemente é armazenada
em um arquivo físico. Você deve estar se perguntando: Como o SGBD
consegue gerenciar todas essas associações? A resposta é simples:
Mantêm todas essas informações no que chamados de dicionário de
dados (ou catálogo) que são áreas de armazenamento com a descri-
ção detalhada de todas essas associações, conhecido também como
metadados.

Para acessar o banco de dados é preciso de um login e de uma


senha. No Oracle existe uma diferenciação entre conta de usuário, que
é um usuário e senha com permissão de efetuar operações no ban-
co de dados, e esquema (ou em inglês schemas) que se refere a uma
conta de usuário com direito de criação de tabelas. Os usuários das
aplicações são configurados no Oracle como conta de usuário, en-
quanto os sistemas propriamente ditos, suas tabelas e demais objetos
são considerados esquemas. Nos próximos conteúdos veremos com
maiores detalhes como criar contas de usuários no banco de dados.
119
Tema 3
SQL – DML e DDL

Na próxima seção, demonstraremos uma versão gratuita do


banco de dados Oracle, Oracle Express Edition (XE). O download dos
instaladores está disponível de forma pública.

Oracle Express Edition – Oracle XE


O Oracle Express Edition é uma versão gratuita do banco de da-
dos Oracle que é capaz de armazenar bases de dados de até 4GB em
servidores monoprocessados.

Para instalação é preciso verificar os seguintes requisitos:

Requisito Valor
Arquitetura do Computador Intel (x86)
Sistema Operacional Windows 2000 SP4 ou posterior

Windows Server 2003

Windows XP Professional SP1 ou


posterior
Protocolo de Rede TCP/IP
Espaço em disco Componentes do servidor: 1.6 GB

Componentes do cliente: 75 MB
Memória RAM Mínimo de 256 MB

Recomendado 512 MB
Microsoft Windows Installer (MSI) Versão MSI 2.0 ou posterior
120
Banco de Dados I

Para instalação do Oracle XE você deve executar os seguintes


passos:

DD Efetuar o download do instalador no site: http://www.oracle.


com/technology/products/database/xe;

DD Clicar na opção Free Download e seguir as instruções con-


forme sua versão do Windows;

DD Após o download, iniciar o processo de instalação clicando


no executável OracleXE.exe ou OracleXEUniv.exe;

DD Na tela de “Boas Vindas” clique no botão Next;

Tela de Boas Vindas – Instalação Oracle Express Edition

DD Na janela de licença de uso do software clique no botão Next;

DD Na tela de seleção do diretório de instalação selecione outra


pasta ou preserve a padrão, c:\oracleexe, e clique no botão
Next;
121
Tema 3
SQL – DML e DDL

Instalação Oracle XE – Seleção do local de instalação

DD Na janela de senhas informe a senha dos usuários com pri-


vilégios administrativos SYS e SYSTEM e clique no botão
Next (memorize esta senha, pois precisaremos utilizá-la nas
próximas seções);

Instalação do Oracle XE – Definição das senhas de SYS e SYS-


TEM
122
Banco de Dados I

DD Janela de confirmação clique em Install e aguarde até o tér-


mino do processo de instalação do banco de dados;

DD Finalmente você poderá, através do seu navegador (Internet


Explorer, por exemplo), acessar a ferramenta de administra-
ção do Oracle XE – Enterprise Manager. Nela você pode efe-
tuar uma série de configurações, parametrizações e criação
de contas de usuário. O acesso é feito através do endereço
http://localhost:1158/em. Efetue o login com o usuário SYS-
TEM e senha informada durante o processo de instalação.

Oracle Sql Developer


Para acesso ao SGBD iremos utilizar a ferramenta Oracle Sql
Developer. Efetue o download no site oficial da Oracle através da URL
http://www.oracle.com/technetwork/developer-tools/sql-develo-
per/downloads/index.html.

Após o download, descompacte o arquivo zip para pasta c:\sql-


developer. A aplicação exige que o Java Development Kit esteja insta-
lado (JDK), caso não tenha instalado selecione a opção de download
com o JDK incluso.

Execute o Oracle Sql Developer e selecione a opção New Con-


nection. Para efetivar a conexão, defina um nome para sua conexão
através do Connection Name, informe o usuário SYSTEM e senha for-
necida durante o processo de instalação. Finalmente, informe o IP ou
nome da máquina que o Oracle XE (geralmente deve ser utilizada a
opção localhost) foi instalado, porta de comunicação (geralmente a
padrão, 1521) e instância do banco de dados através da opção SID (no
caso do Oracle XE utilizar o SID XE).
123
Tema 3
SQL – DML e DDL

Conexão com o banco de dados através do Oracle Sql Developer

Na parte esquerda da figura 40 podemos observar a conexão


realizada com o banco de dados (conexão denominada xe). No painel
localizado na parte superior direita do aplicativo, você poderá escrever
as sentenças SQL cujo resultado será exibido no painel direito inferior.

Agora que temos acesso ao banco de dados, precisaremos pre-


parar o ambiente de laboratório destinado à execução dos exemplos
e exercícios. Para tanto, efetue o download do arquivo scritps.zip dis-
ponível no Ava. Após o download, descompacte o conteúdo na pasta
c:\temp.

Retorne ao Oracle Sql Developer e execute a seguinte linha de


comando para criar o banco de dados do estudo de visto no tema 2:
@c:\temp\scripts.sql

Tecle F5 ou clique no botão Run Scripts, disponível na barra de


ferramentas, para criar a base de dados.
124
Banco de Dados I

Na próxima seção demonstraremos os tipos de dados que es-


tão disponíveis no banco de dados Oracle e como definir as tabelas
que formam a nossa base de dados.

LEITURA COMPLEMENTAR
Você poderá ter mais detalhes da instalação do Oracle XE no site
oficial: <http://download.oracle.com/docs/cd/B25329_01/doc/ins-
tall.102/b25143/toc.htm>.

Para obter mais informações sobre a instalação do SQL Developer


acesso site oficial: <http://download.oracle.com/docs/cd/E12151_01/
doc.150/e12152/intro.htm#CEGGHEFC>.

PARA REFLETIR
Neste conteúdo conhecemos um pouco a respeito do SGBD Oracle,
junto com seus colegas, pesquise outros SGBD existentes verificando
seu fabricante, seu posicionamento no mercado, sua principal utiliza-
ção e empresa que os utilizam.
125
Tema 3
SQL – DML e DDL

3.2
TIPOS DE DADOS E DEFINIÇÃO DE TABELAS

O SGBD Oracle Express XE disponibiliza vários tipos de dados.


A seguir demonstraremos os tipos mais comuns:

Tipo Descrição
CHAR(TAM) Tipo texto de armazenamento fixo que ocupa o
número de bytes definidos para o seu tamanho,
cujo valor pode variar entre 1 e 2000.
VARCHAR2(TAM) Tipo texto de armazenamento variável que ocupa
o número de bytes definidos para o seu tamanho,
cujo valor pode variar entre 1 e 4000.
DATE Tipo utilizado para armazenamento de datas com
informações de dia, mês, ano com 4 dígitos, hora,
minutos e segundos.
INTEGER Armazena números inteiros tais como 1, 10 e 409.
NUMBER(P,S) Único tipo numérico existente no Oracle que é ar-
mazenado como ponto flutuante (números reais).
Armazena números entre 1 x 10-130 e 9.99999 x
10125. O parâmetro p define o número máximo de
dígitos do número, enquanto que o parâmetro s
define quantos dos dígitos são dedicados às ca-
sas decimais. A precisão máxima deste tipo é de
até 38 dígitos. O parâmetro s pode ser omitido.
Neste caso, a escala é zero, ou seja, um número
inteiro.
126
Banco de Dados I

Tipo Descrição
BINARY_FLOAT Introduzido na versão 10g. Suporta um núme-
ro de ponto flutuante de 32 bits. Magnitude:
-2147483647 .. 2147483647.
BINARY_DOUBLE Introduzido na versão 10g. Suporta um número de
ponto flutuante de 64 bits.
CLOB Suporta textos de até 4 GB.

BLOB Suporta dados binários de até 4 GB.

Demonstraremos a seguir um exemplo prático de criação da ta-


bela Alunos do nosso estudo de caso utilizando DDL.

O código DDL de criação de todas as tabelas


pode ser obtido no arquivo script.sql, dispo-
nível no Ava.

Após todo o processo de modelagem e definição do projeto lógico


observamos que a tabela Alunos deve possuir os seguintes campos:

D Matrícula;

D Curso;

D Data de nascimento;

D Total de créditos cursados;

D Média Geral;

D Nome.
127
Tema 3
SQL – DML e DDL

Cada item mencionado pode ser definido utilizando o comando


de DDL CREATE TABLE:

CREATE TABLE ALUNOS


(
MAT_ALU NUMBER (6) NOT NULL ,
COD_CURSO NUMBER (2) NOT NULL ,
DAT_NASC DATE NOT NULL ,
TOT_CRED NUMBER (3) NOT NULL ,
MGP NUMBER (4,2) NOT NULL ,
NOM_ALU VARCHAR2 (60) NOT NULL
)

Agora iremos verificar cada detalhe da sentença de criação da


tabela de alunos:

D A coluna MAT_ALU – Foi definida como um número inteiro


de até seis posições e obrigatória (declaração NOT NULL);

D A coluna COD_CURSO – Foi definida como um número in-


teiro de até duas posições e obrigatória;

D A coluna DAT_NASC - Foi definida como campo de data;

D A coluna MGP – Foi definida como um número real de no


máximo quatro dígitos, sendo dois deles destinados a repre-
sentar as casas decimais. Da mesma forma que as demais,
esta também foi definida como obrigatória. Este campo re-
presenta a média geral do aluno na instituição;

D A coluna NOM_ALU – Foi definida como um campo texto


obrigatório de até 60 posições. É muito interessante utili-
128
Banco de Dados I

zar o tipo VARCHAR2, pois o banco de dados economiza no


armazenamento dos nomes dos alunos com menos de ses-
senta posições;

DD A coluna TOT_CRED – Foi definida como um campo obriga-


tório de número de até três dígitos.

Você pode visualizar o conteúdo da tabela de alunos através da


seguinte sentença SQL:

SELECT * FROM ALUNOS;

O asterisco indica que você deseja recuperar todas as colunas


da tabela de alunos. Como resultado você terá algo semelhante ao de-
mostrado:
MAT_ALU COD_CURSO DAT_NASC TOT_CRED MGP NOM_ALU
-------- ---------- ---------- -------- ----- -----------------------------
911094 10 02/07/1979 158 4,8 Silva Marozzi Cabral
911113 10 01/11/1976 166 5,88 Augusto Coelho
911124 10 14/09/1974 134 4,6 Marcelo Vieira Vieira
911135 10 22/04/1979 32 4,59 Sampaio de Menezes
912548 10 24/07/1972 112 3,9 Gustavo Santos

5 rows selected
129
Tema 3
SQL – DML e DDL

Para executar esta sentença no SQL Developer, digite a senten-


ça e tecle F5, conforme demonstrado na figura 41.

Executando o primeiro comando no Sql Developer

No próximo conteúdo explicaremos cada elemento desta con-


sulta SQL.

É comum os programadores precisarem visualizar a estrutura


da tabela (campos e seus tipos) para construir uma determinada con-
sulta, para isso podemos utilizar o seguinte comando:
130
Banco de Dados I

DESCRIBE ALUNOS;

Como resultado teremos as seguintes informações:

Name Null Type

------------ -------- --------------


MAT_ALU NOT NULL NUMBER(6)
COD_CURSO NOT NULL NUMBER(2)
DAT_NASC NOT NULL DATE
TOT_CRED NOT NULL NUMBER(3)
MGP NOT NULL NUMBER(4,2)
NOM_ALU NOT NULL VARCHAR2(60)

6 rows selected

O SGBD Oracle disponibiliza automaticamente para todos os


usuários uma tabela denominada dual, a qual possui única linha e úni-
ca coluna. Seu objetivo é possibilitar a utilização de funções do SGBD,
sem a necessidade de fazer referência às tabelas do modelo. A sen-
tença SQL a seguir realiza a obtenção da data/hora atual:

SELECT SYSDATE FROM DUAL

O seguinte resultado será exibido:


SYSDATE
-------------------------
11/07/2011 00:02:50

1 rows selected
131
Tema 3
SQL – DML e DDL

A linguagem SQL possibilita que você escreva comandos SQL


utilizando expressões aritméticas. Podemos escrever estas operações
com campos numéricos ou com datas. São quatro os operadores arit-
méticos:
Operador Descrição
-------------------------
+ Adição
- Subtração
* Multiplicação
/ Divisão

Assim como as linguagens de programação, a precedência dos


operadores aritméticos pode ser modificada utilizando parêntesis. O
SQL segue a seguinte precedência de operadores: Multiplicação, Divi-
são, Adição, Subtração. Isso significa que essa é a lista de prioridades
que o SGBD utiliza ao resolver expressões. Por exemplo, considere a
expressão 10 * 5 + 6 / 3 - 4. Quais são os passos para resolução desta
expressão? Neste caso o banco de dados calcula a expressão na se-
guinte ordem:

DD Multiplicação: 10 * 5 = 50;

DD Divisão: 6 / 3 = 2;

DD Adição: Resultado da multiplicação: 50 + Resultado da divi-


são: 2 = 52;

DD Subtração: Resultado da adição: 52 – 4 = 48.


132
Banco de Dados I

Você pode testar o resultado da expressão através do seguinte


comando SQL:

SELECT 10 * 5 + 6 / 3 - 4

FROM DUAL

Conforme mencionado podemos modificar a precedência dos


operadores utilizando parêntesis. Considere a expressão:

SELECT 40 - 3 * 10

FROM DUAL;

O resultado desta operação segue a precedência: Multiplicação


e Subtração: 40 – Resultado da Multiplicação: 30. Temos o seguinte
resultado:
40-3*10
----------------------
10

Imagine que o desejado é inverter a ordem das operações, ou


seja, subtração antes da multiplicação. A seguinte expressão modifica
a ordem de resolução dando prioridade às expressões envolvidas pri-
meiramente pelo parêntesis:
133
Tema 3
SQL – DML e DDL

SELECT ( 40 - 3 ) * 10

FROM DUAL

Conforme esperado, temos como resultado a subtração (37)


multiplicada por 10:
(40-3)*10
----------------------
370

A adição ou subtração de números inteiros a uma data ocasio-


nam, respectivamente, o acréscimo ou decréscimo de dias a data. Ve-
jamos os exemplos:

Exemplo 01: Adicionando 10 dias a data atual (considerando a


data atual como 12/07/11):

SELECT SYSDATE + 10

FROM DUAL

Resultado:

SYSDATE+10
-------------------------
22/07/11
1 rows selected
134
Banco de Dados I

Exemplo 02: Subtraindo 10 dias da data atual (considerando a


data atual como 12/07/11):

SELECT SYSDATE - 10

FROM DUAL

Resultado:
SYSDATE-10
-------------------------
02/07/11
1 rows selected

As datas no Oracle não podem ser multiplicadas ou divididas.


Neste caso, o banco emite uma mensagem de erro.

Adicionar um minuto a uma data equivale a adição de 1 / 1440


a ela. Bem como, adicionar um segundo a uma data equivale a adição
de 1/86400 a ela. Como chegamos nesta conclusão?

Para adição do minuto, fazemos uma simples regra de três:


1 dia ------ 1440 minutos (24 horas x 60 minutos)
X ------ 1 minuto
X = 1 / 1440
135
Tema 3
SQL – DML e DDL

Para adição do segundo, utilizamos mais uma regra de três:


1 dia ------ 86400 segundos (24 horas x 60 minutos x
60 segundos)
X ------ 1 segundo
X = 1 / 86400.

O seguinte exemplo demonstra respectivamente, a adição de


três minutos a data atual e adição de dois segundos a data atual:

SELECT SYSDATE,

SYSDATE + 3/1440,

SYSDATE + 2/86400

FROM DUAL

Segue o resultado desta consulta:

SYSDATE SYSDATE+3/1440 SYSDATE+2/86400

------------------- ------------------- -------------------

12/07/2011 22:55:09 12/07/2011 22:58:09 12/07/2011 22:55:11

1 rows selected
136
Banco de Dados I

LEITURA COMPLEMENTAR
Para maiores detalhes a respeito dos tipos de dados Oracle você pode
consultar a documentação oficial do SGBD, em: <http://download.ora-
cle.com/docs/cd/B19306_01/server.102/b14200/sql_elements001.
htm#i54330>.

Você pode encontrar maiores detalhes sobre as operações de datas


no banco de dados Oracle em: <http://download.oracle.com/docs/cd/
B19306_01/server.102/b14200/sql_elements001.htm#SQLRF0021>.

PARA REFLETIR
Mencionamos neste conteúdo que podemos expressar número em
ponto flutuante com o tipo NUMBER. Entrando, a partir da versão 10g
do SGBD foram introduzidos os tipos BINARY_DOUBLE e BINARY_
FLOAT. Pesquise juntamente com os seus colegas as reais vantagens
em se utilizar esses novos tipos.
137
Tema 3
SQL – DML e DDL

3.3
RESTRIÇÕES DE INTEGRIDADE E INDEXAÇÃO

Como vimos no tema 2, as restrições (que a partir deste tema


também podemos chamar de constraints) podem ser consideradas
como um mecanismo para impedir a entrada de dados inválidos nos
campos de uma determinada tabela.

Imagine a tabela de notas dos alunos. Quais seriam os valores vá-


lidos das notas? É possível introduzir valores negativos? E superiores a
dez? Através da imposição de restrições podemos garantir que somen-
te notas no intervalo de zero a dez sejam lançadas, por exemplo.

No servidor de banco de dados Oracle podemos utilizar cinco


tipos de restrições:

NOT NULL
O que significa um valor nulo? É o número zero? É um espa-
ço em branco? É uma string vazia? Nulo significa ausência de dado.
Uma tabela que possui uma coluna nula indica que existe uma lacuna
para sem valor algum, pois NULL significa indisponível, desconhecido
e inaplicável. Em suma, os atributos das tabelas que admitem NULL
precisam ser analisados de forma especial.

Este tipo de restrição assegura que a coluna da tabela não deve


conter valores nulos. As colunas sem esta restrição, por padrão, po-
dem conter valores nulos. O exemplo a seguir demonstra imposição
da restrição de não nulidade das colunas código da disciplina, quanti-
dade de créditos e nome da disciplina, respectivamente:
138
Banco de Dados I

CREATE TABLE DISCIPLINAS


(
COD_DISC NUMBER (6) NOT NULL ,
CRREDITOS NUMBER (2) NOT NULL ,
NOM_DISC VARCHAR2 (60) NOT NULL
)

UNIQUE

É um tipo de imposição que cada valor de uma coluna ou con-


junto de colunas seja único (representa a chave candidata cujo con-
ceito foi visto no tema 3). A coluna ou lista de coluna definidas com
esta restrição é comumente nomeada como chave exclusiva ou cha-
ve única. Para exemplificar a utilização desta restrição verificamos a
tabela de professores onde o campo que representa a matrícula do
professor é uma chave única:

CREATE TABLE PROFESSORES


(
IDT_PROF NUMBER (6) NOT NULL ,
MAT_PROF CHAR (6) NOT NULL ,
NOM_PROF VARCHAR2 (80) NOT NULL,
CONSTRAINT mat_prof_uk UNIQUE(mat_prof)
)
139
Tema 3
SQL – DML e DDL

Note que é preciso definir o nome da restrição MAT_PROF_UK


e após a palavra reservada UNIQUE a coluna ou lista de colunas. Caso
desejássemos adicionar várias colunas poderíamos adicionar a lista
separando por vírgula. Segue a sintaxe de definição de chaves únicas:

CONSTRAINT <nome_restricao>
UNIQUE (<coluna01>,
<coluna02>,
<coluna03>,
...
<coluna_N>);

Em uma tabela podemos definir várias chaves únicas. Para tan-


to basta adicionar cada declaração das chaves conforme descrito an-
teriormente.

PRIMARY KEY
Esta restrição define a chave primária da tabela que define a
unicidade de cada linha. Cada tabela possui somente uma chave pri-
mária. Assim como as restrições de chaves únicas, as chaves primá-
rias permitem que uma única coluna ou lista de colunas sejam con-
templadas em sua definição. A seguir demonstraremos a definição da
chave primária da tabela MATRÍCULAS, formada pelo ano, semestre,
disciplina e aluno, conforme definição do projeto lógico:
140
Banco de Dados I

CREATE TABLE MATRICULAS


(
MAT_ALU NUMBER (6) NOT NULL ,
ANO NUMBER (4) NOT NULL ,
SEMESTRE NUMBER (1) NOT NULL ,
COD_DISC NUMBER (6) NOT NULL ,
CONSTRAINT MAT_PK
PRIMARY KEY ( ANO,
SEMESTRE,
COD_DISC,
MAT_ALU ) )

Note que a definição da restrição de chave primária é bem se-


melhante à definição de chaves única.

A restrição de chave única pode ser imposta através do coman-


do ALTER TABLE, a seguir veremos alguns exemplos:

ALTER TABLE CURSOS


ADD CONSTRAINT CRS_PK
PRIMARY KEY ( COD_CURSO ) ;

ALTER TABLE DISCIPLINAS


ADD CONSTRAINT DSC_PK
PRIMARY KEY ( COD_DISC ) ;

ALTER TABLE MATRICULAS


ADD CONSTRAINT MAT_PK
PRIMARY KEY ( ANO,
SEMESTRE,
COD_DISC,
MAT_ALU ) ;
141
Tema 3
SQL – DML e DDL

ALTER TABLE TURMAS


ADD CONSTRAINT TUR_PK
PRIMARY KEY ( ANO,
SEMESTRE,
COD_DISC,
TURMA ) ;

FOREIGN KEY
Imagine o seguinte cenário: O aluno THIAGO LIMA, cujo núme-
ro de matrícula é 207112 está matriculado na disciplina 101547-BAN-
CO DE DADOS. Considerando as estruturas das tabelas de disciplinas
e de matrículas descritas anteriormente podemos visualizar os dados:

Tabela de disciplinas:
COD_DISC CREDITOS NOM_DISC
--------- -------- --------------
101547 4 BANCO DE DADOS

Tabela de matrículas:
MAT_ALU ANO SEM COD_DISC
------- ---- --- --------
207112 2011 2 101547
142
Banco de Dados I

Como garantir que a disciplina não será excluída caso existam


matrículas vinculadas? Esse tipo de restrição, denominado de res-
trição de integridade referencial define um número de colunas como
chave estrangeira que estabelece um relacionamento entre as tabelas.
Neste caso precisamos definir o campo código da disciplina, na tabe-
la de matrículas, como chave estrangeira para a tabela de disciplinas.
Para adicionar uma restrição a tabela existente, podemos utilizar o co-
mando ALTER combinado à definição de chave estrangeira:
ALTER TABLE MATRICULAS
ADD CONSTRAINT MAT_DSC_FK FOREIGN KEY
( COD_DISC )
REFERENCES DISCIPLINAS
( COD_DISC )

O comando ALTER também pode ser utilizado para impor as


restrições de não nulidade (NOT NULL), chave exclusiva (UNIQUE
KEY) e chave primária (PRIMARY KEY). A seguir os respectivos
exemplos:
ALTER TABLE DISCIPLINAS
MODIFY QTD_CRED NUMBER(2) NULL;

ALTER TABLE PROFESSORES


ADD CONSTRAINT mat_prof_uk
UNIQUE(mat_prof)

ALTER TABLE MATRICULAS


ADD CONSTRAINT MAT_PK
PRIMARY KEY ( ANO,
SEMESTRE,
COD_DISC,
MAT_ALU );
143
Tema 3
SQL – DML e DDL

Não há limites de quantidade de chaves estrangeiras em uma


tabela.

CHECK
Define as condições que cada campo da tabela deve atender. No
exemplo a seguir definiremos uma restrição onde a nota do aluno na
primeira unidade, campo NOTA01, deve estar entre zero e dez:

ALTER TABLE NOTAS


ADD CONSTRAINT notas_und01_ck
CHECK ( nota01 between 0 and 10);

Não há limites de quantidade deste tipo de restrição para cada


tabela. Note que a restrição é imposta a tabela de notas, o nome da
restrição é notas_und01_ck e a verificação é feita baseando-se no
campo nota01 que o valor deve estar compreendido entre zero e dez.

A seguir alguns exemplos de CHECKS CONTRAINS:

ALTER TABLE DISCIPLINAS


ADD CONSTRAINT COD_DISC_CK
CHECK ( cod_disc > 0 );

ALTER TABLE ALUNOS


ADD CONSTRAINT ALU_MGP_CK
CHECK ( mgp between 0 and 10);
144
Banco de Dados I

ALTER TABLE MATRICULAS


ADD CONSTRAINT MAT_FAL_01_CK
CHECK ( faltas_1 >= 0 )

ALTER TABLE MATRICULAS


ADD CONSTRAINT MAT_SEM_CK
CHECK ( semestre in( 1, 2 ) )

Indexação
Indexação é um método de ajuste de desempenho que permite
recuperação mais rápida de registros. Por exemplo, considere a tabela
de alunos com as colunas código do aluno, nome do aluno e matrícula;
é possível criar um índice para o campo matrícula, pois é bem comum
a necessidade de localizar o registro de um determinado aluno através
do seu número de matrícula. Você deve estar imaginando, então vou
criar índices para todas as colunas de todas as tabelas do banco, as-
sim as consultas terão o melhor desempenho?

É importante ressaltar que a estrutura de um índice consome


recursos de espaço em disco. Além disso, existe uma perda de desem-
penho nas operações de manipulação de dados que verificaremos nos
itens mais a seguir.

A sintaxe básica para criação de um índice é a seguinte:


CREATE INDEX <nome_do_indice>
ON <nome_da_tabela> (<lista_de_colunas>)
145
Tema 3
SQL – DML e DDL

Na declaração devemos definir o nome do índice, tabela e lista


de colunas separadas por vírgula.

Anteriormente, exemplificamos o índice com a matrícula na ta-


bela de alunos. De acordo com a sintaxe, a criação para este índice
ficaria da seguinte forma:

CREATE INDEX MAT_ALU_IDX

ON ALUNOS (MAT_ALU)

Para excluir um índice devemos utilizar a seguinte sintaxe:

DROP INDEX ALUNOS_MAT_I;

Conforme mencionado anteriormente, os índices são funda-


mentais para que as consultas SQL sejam executadas de forma mais
rápida. Quando uma sentença SQL é executada com a cláusula WHE-
RE, o Oracle precisa identificar quais são as linhas que devem ser se-
lecionadas. Quando não existe índice definido para as colunas com-
templadas na cláusula WHERE, a única forma de localizar as linhas
a serem selecionadas é realizar uma operação denominada full table
scan. Esta operação realiza a leitura de todas as linhas da tabela em
busca das linhas relevantes. Caso a tabela em questão possua bilhões
de linhas, a busca pode levar horas. Um índice é uma lista ordenada de
chaves estruturadas geralmente em forma de árvore B que é capaz de
localizar as linhas relevantes com alto desempenho.

É importante ressaltar que em certas situações que a tabela


possui baixo volume de linhas é melhor efetuar um full table scan ao
146
Banco de Dados I

invés de utilizar índices. Esta decisão do que é melhor utilizar, índice


ou full table scan, é delegado ao Oracle que efetua a melhor decisão
baseando-se em informações estatísticas de acesso.

Além de servir como facilitador na localização de registros rele-


vantes, os índices podem ser utilizados para ordenar os dados. Caso o
comando não contemple a cláusula de ordenação ORDER BY o Oracle
irá seguir a ordem estipulada na definição de cada índice da tabela.

LEITURA COMPLEMENTAR
D SERSON, Roberto R. Oracle 10g Database – Guia do DBA. São
Paulo: Novatec, 2004.

No capítulo 9 você terá maiores detalhes sobre os conceitos que


abrangem indexação.

Você pode encontrar maiores detalhes sobre as restrições na docu-


mentação oficial da Oracle: <http://download.oracle.com/docs/cd/
B19306_01/server.102/b14200/clauses002.htm>.

PARA REFLETIR
Nesta seção estudamos como criar restrições e índices. Imagine uma
chave estrangeira de uma tabela A para tabela B. Visto que é bem
comum filtrar os registros da tabela A através da chave estrangeira,
pesquise junto com o seus colegas sobre a boa prática de criar índices
para as chaves estrangeiras.
147
Tema 3
SQL – DML e DDL

3.4
SQL – SELECT – FROM - WHERE

Agora vamos tratar apenas dos comandos de recuperação da


linguagem SQL. Basicamente a linguagem SQL possui apenas um co-
mando de recuperação, SELECT, cuja estrutura básica é demonstrada
a seguir:
SELECT <cláusula de projeção>
FROM <cláusula de seleção>
WHERE <condições da consulta>
GROUP BY <critérios de agrupamento>
HAVING <condições do agrupamento>
ORDER BY <critério de ordenação>;

D <cláusula de projeção>: seção destinada a declaração da lista


de colunas a serem exibidas ou projetadas após a execução
do comando SQL. As colunas devem ser separas por vírgulas;

D <cláusula de seleção>: define a lista de tabelas utilizadas no


comando SQL. Assim como na seção de projeção, devemos
separá-las por vírgulas;

D <condições de consulta>: destinada as declarações e con-


dicionais de filtro dos registros. Por exemplo, listar somente
os cursos de código 10;

D <critérios de agrupamento>: seção destinada à definição de


critérios para sumarizar os dados da consulta. Imagine uma
tabela de alunos que possui a coluna curso, podemos utilizar
esta cláusula para realizar uma contagem do quantitativo de
alunos por curso;
148
Banco de Dados I

DD <condições de agrupamento>: seção dedicada à definição


de critérios de filtragem às informações já sumarizadas;

DD <critérios de ordenação>: seção que define a lista de prio-


ridade que a consulta deve utilizar para exibir os dados. Por
exemplo, listar as informações ordenadas por curso e depois
por nome do aluno.

Considere a tabela de disciplinas com o seguinte conteúdo:

COD_DISC CREDITOS NOM_DISC


-------- -------- -----------------------
200070 4 INTRODUCAO C. SOCIAIS
200657 4 ADMINISTRAÇÃO I
200746 6 ORGANIZAÇÃO E MÉT. II
200851 2 BANCO DE DADOS
200967 8 INFO. ADMINISTRAÇÃO

Este resultado foi obtido através do comando SELECT na sua


forma mais simples:

SELECT *

FROM DISCIPLINAS

É importante observar que o asterisco pode ser utilizado para


listar todos os atributos a tabela disciplinas. Você deve estar imagi-
nando, como o banco de dados consegue definir a ordem de exibição
das colunas? Utilizando o asterisco o banco de dados realiza a exi-
149
Tema 3
SQL – DML e DDL

bição conforme ordem de definição na tabela, neste caso: cod_disc,


creditos e nom_disc.

A estrutura mínima e obrigatória de todo e qualquer comando


SQL é utilizar sempre as cláusulas SELECT e FROM. A primeira tem
como função projetar os atributos do resultado e a segunda tem como
função selecionar as tabelas envolvidas no comando SQL.

Considerando a mesma tabela de disciplinas, como fazer um fil-


tro para recuperar somente a disciplina de código 200851? Podemos
utilizar a cláusula WHERE para estabelecer este critério de filtro. En-
tão o comando SQL pode ser escrito da seguinte forma:

SELECT *

FROM DISCIPLINAS

WHERE COD_DISC = 200851

Imagine que não é necessário exibir todas as colunas da tabela


de disciplinas, somente o código e nome da disciplina. Podemos rees-
crever a sentença da seguinte forma:

SELECT COD_DISC, NOM_DISC

FROM DISCIPLINAS

WHERE COD_DISC = 200851


150
Banco de Dados I

Note que as colunas não possuem nomenclatura amigável para


o usuário final. A linguagem SQL nos permite renomear as colunas de
forma que se afaste um pouco mais da visão computacional e aproxi-
me-se um pouco mais da compreensão humana:

SELECT COD_DISC “CÓDIGO DISCIPLINA”,

NOM_DISC “DISCIPLINA”

FROM DISCIPLINAS

WHERE COD_DISC = 200851

Agora veremos alguns operadores úteis que podem ser combi-


nados à cláusula WHERE, são eles:

[NOT] IN
Utilizado para filtrar os registros baseando-se na lista informa-
da, por exemplo:

Como selecionar as disciplinas de dois e quatro créditos? Pode-


mos utilizar a seguinte sentença SQL:

SELECT cod_disc, nom_disc, qtd_cred

FROM DISCIPLINAS

WHERE QTD_CRED IN( 2, 4 )


151
Tema 3
SQL – DML e DDL

Agora imagine que você precisa listar todas as disciplinas, ex-


ceto as de dois e quatro créditos. Para tanto, basta utilizar a cláusula
de negação NOT:

SELECT cod_disc, nom_disc, qtd_cred

FROM DISCIPLINAS

WHERE CREDITOS NOT IN( 2, 4 )

[NOT] BETWEEN:
Deve ser utilizado para filtrar um atributo através de uma faixa
de valores. Suponha que você deseja listar as disciplinas cujo código
está entre 200850 e 200950. A seguinte consulta SQL poderia gerar
este resultado:

SELECT COD_DISC, NOM_DISC, QTD_CREDITOS

FROM DISCIPLINAS

WHERE COD_DISC BETWEEN 200850 AND 200950

Caso necessite listar todas as disciplinas exceto as que o código


pertença a uma determinada faixa? Da mesma forma que ocorre na
cláusula IN, basta utilizar o operador de negação:
152
Banco de Dados I

SELECT cod_disc, nom_disc, qtd_cred

FROM DISCIPLINAS

WHERE COD_DISC NOT BETWEEN 200850 AND 200950;

[NOT] LIKE
Este comando deve ser utilizado para filtrar um texto. Podemos
combinar o símbolo para indicar qualquer conjunto de caracteres. Por
exemplo: Listar todas as disciplinas que possuam a palavra “ADMI-
NISTRAÇÃO” em sua descrição, independentemente se a palavra está
localizada no início do nome da disciplina, no centro ou no término:

SELECT COD_DISC, NOM_DISC, QTD_CRED

FROM DISCIPLINAS

WHERE NOM_DISC LIKE ‘%ADMINISTRAÇÃO%’

Note que o símbolo ‘%’ indica que pode ocorrer qualquer carac-
tere à esquerda (início) ou qualquer caractere à direita (término). De
forma análoga aos demais, podemos utilizar o operador de negação
NOT para listar todas as disciplinas que não possuem a palavra “AD-
MINISTRAÇÃO”. Nos conteúdos anteriores comentamos sobre nu-
lidade dos campos que indica se o atributo poderá assumir valores
nulos ou não. O que é um valor NULL? É um texto vazio? Representa
zero? Na realidade, NULL é a representação de um valor desconheci-
do. É um erro comum dos desenvolvedores escreverem a sentença da
seguinte forma:
153
Tema 3
SQL – DML e DDL

SELECT *

FROM CURSOS

WHERE COD_COORD = NULL

Este último comando não retorna resultados, pois NULL é des-


conhecido, portanto, não podemos fazer comparações com ele. Para
verificar se os valores estão nulos devemos utilizar os predicados IS
NULL e IS NOT NULL. Desta forma, podemos reescrever o comando
de forma correta, utilizando o predicado:

SELECT *

FROM CURSOS

WHERE COD_COORD IS NULL

A sentença SQL demonstrada exibe todos os cursos onde o có-


digo dos coordenadores não está preenchido, ou seja, está nulo.
154
Banco de Dados I

Operadores Relacionais

Os operadores relacionais estabelecem uma relação entre dois


operandos. O tipo de relação entre os operandos é definido pelo ope-
rador. Na verdade são operadores de comparação de valores. Por
exemplo, para verificar se um curso é igual a dez utilizaríamos o ope-
rador de igualdade com os seguintes operandos: COD_CURSO = 10.
Os demais operadores relacionais são:

Operador Descrição

----------- --------------------------

<> ou != Diferente
< Menor que
> Maior que
<= Menor ou igual
>= Maior ou igual

A seguir alguns exemplos utilizando operadores relacionais:

Lista dos cursos cujo código do curso igual dez;

SELECT *

FROM CURSOS

WHERE COD_CURSO = 10
155
Tema 3
SQL – DML e DDL

Lista dos cursos cujo código é menor ou igual a cinquenta;

SELECT *

FROM CURSOS

WHERE COD_CURSO <= 50

Agora imagine que você deseja obter os registros dos cursos 26


- Ciência da Computação e 52 - Sistemas de Informação. Como elabo-
rar uma consulta que atenda a esta demanda? Além da possibilidade
de resolver utilizando a cláusula IN, é possível fazer o uso do operador
lógico OR (ou), da seguinte forma:

SELECT *

FROM CURSOS

WHERE COD_CURSO = 26 OR

COD_CURSO = 52

Agora vamos definir um requisito mais elaborado. O desejado é


listar os alunos do curso 26 - Ciência da Computação cuja MGP (mé-
dia geral) é maior que sete. Neste caso, a solução é utilizar operadores
relacionais combinados ao operador lógico AND (e):
156
Banco de Dados I

SELECT *

FROM CURSOS

WHERE COD_CURSO = 26 AND

MGP > 7

Até então todos os exemplos não estavam considerando o cri-


tério de ordenação dos registros. Para este fim, devemos adicionar a
cláusula ORDER BY na sentença SQL. Esta cláusula deve ser combi-
nada com a lista de colunas, que sofrerão ordenação. A ordem destas
colunas define a regra de prioridade utilizada para ordenar os regis-
tros. Para cada atributo ainda é possível, opcionalmente, definir o tipo
de ordenação: Crescente (ASC) e Decrescente (DESC). Caso a forma
de ordenação não seja especificada, será considerada a forma cres-
cente como padrão.

O comando a seguir exibirá a lista de alunos ordenados em or-


dem alfabética pelo nome:

SELECT MAT_ALU, NOM_ALU

FROM ALUNOS

ORDER BY NOM_ALU ASC


157
Tema 3
SQL – DML e DDL

Este mesmo comando pode ser escrito omitindo o tipo de orde-


nação ASC:

SELECT MAT_ALU, NOM_ALU

FROM ALUNOS

ORDER BY NOM_ALU

Agora demonstraremos um exemplo utilizando o tipo de orde-


nação decrescente (DESC). Neste exemplo iremos exibir a relação de
alunos com sua média geral, considerando como primeiro critério de
ordenação a média, em ordem decrescente, e como segundo critério,
o nome do aluno:

SELECT MAT_ALU, NOM_ALU, MGP

FROM ALUNOS

ORDER BY MGP DESC, NOM_ALU

Note que é possível que dois alunos possuam a mesma mé-


dia geral. Suponha que as alunas NATHALIE e MARIANA possuam
a mesma MGP, neste cenário o registro da aluna MARIA será exibido
antes do registro NATHALIE, pois o critério de desempate foi definido
em ordem alfabética de forma crescente.
158
Banco de Dados I

LEITURA COMPLEMENTAR

D ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de Banco de


Dados. 4. ed., São Paulo: Pearson Brasil, 2005.

O capítulo 8 deste livro trata exclusivamente da linguagem SQL, faça


a sua leitura até a seção 8.4 para obter mais detalhes da linguagem
SQL.

Você pode verificar algumas informações adicionais sobre a lingua-


gem SQL em: <http://download.oracle.com/docs/cd/B19306_01/ser-
ver.102/b14200/intro.htm#i8097>.

PARA REFLETIR
Utilizando os conhecimento obtidos até agora e junto com seus cole-
gas elabore a sentença SQL necessária para recuperar todos os alunos
do curso 26 que possuem média maior ou igual a 6 e todos os alunos
do curso 10 que possuem média menor que 6.
159
Tema 3
SQL – DML e DDL

RESUMO
Neste tema abordamos os conceitos iniciais sobre a arquitetura do
banco de dados Oracle, instalação da versão Oracle Express Edition
e da ferramenta SQL Developer para interagir com o banco de dados.

Além disso, falamos sobre os tipos de dados, definição de tabelas e


restrições e como criar e excluir índices.

Também estudamos a parte inicial da linguagem SQL, que consiste


nas operações básicas utilizando a sentença SELECT.

No próximo tema, abordaremos consultas SQL um pouco mais com-


plexas, como também os comandos de atualização: inclusão, altera-
ção e exclusão.
Anotações

Você também pode gostar