Você está na página 1de 33

SQL

Structure Query Language


SQL - Structure Query Language

Sumrio

1. INTRODUO 3
1.1. SOBRE SQL 3
1.2. VISO GERAL DE UM BANCO DE DADOS RELACIONAL 3
1.3. COLUNAS E LINHAS 4
1.4. ENTIDADES E CHAVE PRIMRIA 4
1.5. CHAVE PRIMRIA COMPOSTA 5
2. A LINGUAGEM SQL 6
2.1. CRIANDO UMA TABELA 6
2.2. IDENTIFICADORES E ATRIBUTOS 7
2.3. TIPOS DE DADOS 7
2.3.1. DADOS CARACTERES STRINGS 7
2.3.2. DADOS NUMRICOS 7
2.3.3. DADOS DATA E HORA 8
2.4. INCLUINDO DADOS 8
3. QUERIES: OBTENDO OS DADOS DESEJADOS 9
3.1. CLUSULAS SELECT E FROM 9
3.2. CLUSULA WHERE 10
3.2.1. PREDICADOS RELACIONAIS 11
3.2.2. OUTROS PREDICADOS RELACIONAIS 11
3.2.3. VINCULANDO VRIOS PREDICADOS: AND E OR 13
4. QUERIES: MANIPULANDO DADOS 14
4.1. OPERADORES ARITMTICOS 14
4.2. FUNES 15
4.2.1. FUNES AGREGADAS 15
4.2.2. FUNES NO AGREGADAS 15
4.2.3. FUNES DE SEQNCIAS DE CARACTERES 16
4.2.4. FUNES DE DATA E HORA 16
5. ORGANIZANDO O RESULTADO 17
5.1. CLUSULA GROUP BY 17
5.2. CLUSULA HAVING 17
5.3. CLUSULA ORDER BY 18
6. JUNES: QUERIES QUE ENVOLVEM MAIS DE UMA TABELA 19
6.1. EQUIJUNES 20
6.2. JUNES EXTERNAS 21
6.3. AUTO-JUNES 21
6.4. OUTROS TIPOS DE JUNES 23
7. QUERIES EM OUTRAS DECLARAES 23
7.1. DECLARAO UNION 23
7.2. UTILIZANDO QUERIES PARA INCLUIR DADOS 23

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 1


SQL - Structure Query Language

8. ALTERANDO TABELAS E DADOS 24


8.1. ALTERANDO OS DADOS 24
8.1.1. ATUALIZANDO DADOS EM UMA LINHA 24
8.1.2. ELIMINANDO LINHAS 25
8.1.3. GRAVANDO E DESFAZENDO ALTERAES 25
8.2. ALTERANDO UMA TABELA 25
8.2.1. ELIMINANDO UMA COLUNA 26
8.2.2. INCLUINDO UMA COLUNA 26
8.2.3. MODIFICANDO UMA COLUNA 27
8.2.4. TROCANDO O NOME DE UMA TABELA OU COLUNA 27
8.2.5. ELIMINANDO UMA TABELA 27
9. UTILIZANDO NDICE PARA MELHORAR A PERFORMANCE 28
9.1. UTILIZANDO UM NDICE 28
9.2. UTILIZANDO UM NDICE NICO 28
9.3. UTILIZANDO UM NDICE CONCATENADO 29
9.4. APAGANDO UM NDICE 29
10. PROGRAMANDO EM SQL 30
10.1. PORQUE SQL EMBUTIDA 30
10.2. UTILIZANDO A FERRAMENTA ACCESS 30

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 2


SQL - Structure Query Language

1.Introduo

1.1. Sobre SQL


Um banco de dados como um arquivo eletrnico, ou seja, tem a mesma funo que qualquer outro
arquivo armazenar registros. A nica diferena que no banco de dados os registros so armazenados
eletronicamente.
Para termos acesso aos registros armazenados ou mesmo cadastrar novos registros, precisamos de um
sistema que gerencie o banco de dados. Este sistema gerenciador de banco de dados que torna possveis
as operaes com o contedo do arquivo, como Traga-me este arquivo, Atualize este registro.
Existem vrios tipos de sistemas de gerenciamento de banco de dados (SGBD ou DBMS), representando
diversas abordagens relativas s tarefas de acesso s informaes contidas no banco de dados, preservao
da integridade dos dados, acompanhamento dos usurios e manuteno da segurana. Para o nosso estudo,
porm, podemos classificar todos os sistemas em dois tipos: relacionais e no relacionais, embora seja
visvel o predomnio da abordagem relacional nos novos sistemas do mercado.
Em um sistema relacional, os dados so armazenados e representados exclusivamente em tabelas. Em
nenhum momento faz-se necessrio recorrer a outras estruturas, como rvores hierrquicas, para ter acesso
aos dados.
A linguagem SQL o nome a sigla de Structured Query Language (Linguagem de Query Estruturada)
uma linguagem para gerenciar um sistema de banco de dados relacional. No s uma linguagem,
como tambm tem sido to utilizada que pode ser considerada um padro. Consiste de uma srie de
declaraes, adotadas de comum acordo, que nos permitem realizar diversas operaes.
Temos que usar a expresso comum acordo porque, embora uma SQL padro tenha sido criada pelo
Instituto de Padres Nacionais Americanos (ANSI), todas as implementaes particulares da SQL
personalizam a linguagem de vrias formas. Tais implementaes complementam a linguagem padro com
novos tipos de declaraes ou expresses e muitas vezes adaptam as declaraes padronizadas s
necessidades especficas.

1.2. Viso Geral de um Banco de Dados Relacional


Sistemas relacionais caracterizam um grande avano no armazenamento e no gerenciamento de grandes
quantidades de dados. A principal razo para isso que, em um sistema relacional, pode-se reduzir bastante
o armazenamento de dados redundantes. Na verdade, idealmente falando, em um sistema projetado
segundo os princpios tericos da abordagem relacional, a redundncia no deve existir. Nenhum
relacionamento entre dois itens de dados (uma pessoa possui um endereo, por exemplo) deve aparecer
mais de uma vez em cada um banco de dados.
Na prtica, os sistemas apenas se aproximam deste ideal, por vrias razes, e podemos dizer que
normalmente contm alguns dados repetidos em vrios lugares. Mas mesmo em um sistema relacional que
apenas se aproxime da situao ideal, minimizar a redundncia dos dados acarreta dois benefcios bsicos:
em primeiro lugar, os dados podem ser reorganizados e combinados de forma mais facilmente em novos
relacionamentos; no ficam presos aos relacionamentos em que foram armazenados. Em segundo lugar, a
atualizao torna-se muito mais fcil, pois poucos itens de dados tm que ser atualizados, o que reduz a
incidncia de erros.
Todos os dados de um sistema relacional so armazenados e exibidos em tabelas. Programas de planilhas e
sistemas de banco de dados no relacionais tambm usam tabelas, portanto no uma caracterstica
exclusiva dos sistemas relacionais. Mas h algo que distingue a forma como os sistemas relacionais usam
tabelas. Esta distino deriva-se da definio e da utilizao do banco de dados segundo certos princpios
tericos da abordagem relacional. Mais adiante iremos abordar tais princpios.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 3


SQL - Structure Query Language

1.3. Colunas e Linhas


Qualquer informao refere-se a qualquer coisa, e talvez o primeiro princpio da abordagem relacional seja
o de todas as informaes contidas em uma tabela devem estar sempre relacionadas a exemplos de um
tipo de coisa. Este princpio destingue o uso relacional de tabelas.
Por exemplo, a tabela HOSPEDES abaixo contm informaes sobre os scios de um clube de tratamento
da forma fsica, selecionado, conceituado e imaginrio chamado Visual Spa (fig. 1.1).

Fig. 1.1 - HOSPEDES

NOME SEXO BIOTIPO ALTURA


JOS AUGUSTO M M 1,67
MAURCIO DE SOUZA M M 1,72
BIANCA OLIVEIRA F G 1,65
JANE FYUNDAI F G 1,80
STELLA SHIELDS F M 1,65
ROGRIO NUNES M M 1,78

A tabela possui quatro colunas NOME, SEXO, BIOTIPO e ALTURA e 6 linhas.


Contm informaes sobre os hspedes do Spa; cada coluna vertical possui dados referentes a uma
caracterstica ou atributo dos hspedes. Os atributos em que estamos interessados so nome, sexo, biotipo e
altura de cada hspede; por isso destinamos uma coluna a cada um deles.
Esta a funo das colunas verticais de uma tabela: conter informaes sobre os atributos das entidades a
que se refere a tabela.
Cada linha horizontal da tabela HOSPEDE contm as informaes sobre todos os atributos referentes a um
determinado hspede. Portanto, enquanto a coluna NOME exibe os nomes de todos os hspedes da tabela e
a coluna SEXO o sexo de todos os hspedes e assim por diante em relao s outras colunas, a linha em
que aparece o nome Jos Augusto contm informaes apenas referentes aos atributos do hspede chamado
Jos Augusto. Mais adiante introduziremos um novo conceito relacional: o de chave primria.

1.4. Entidades e Chave Primria


No mundo real, voc teria inmeras razes para querer tratar cada hspede do Visual Spa individualmente:
se voc no consider-los separadamente, no poder designar os quartos adequadamente, elaborar os
programas de emagrecimento segundo as necessidades de cada um, preparar as faturas corretamente, e
assim por diante. Pelas mesmas razes, voc ter que ter os hspedes tambm individualizados no banco de
dados. Em termos prticos, isto significa que as linhas da tabela devem ser diferenciadas. Se voc no
puder diferenciar a linha de Jos Augusto da de Maurcio de Souza, o banco de dados no lhe dar
condies para designar os quartos adequadamente, elaborar os programas de emagrecimento segundo as
necessidades de cada um, preparar as faturas corretamente, e assim por diante.
Para que uma linha possa se distinguir das outras, tem que ser de alguma forma diferente, ou seja, tem que
ter uma caracterstica que a identifique. Em um sistema relacional, esta caracterstica identificadora no
pode ser identificador externo, como a posio que a linha ocupa em relao s outras; tem que ser um dos
prprios componentes da linha. Como a linha s consiste de itens de dados, temos que tentar localizar
dentre os dados da linha aquele que poder identific-la univocamente.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 4


SQL - Structure Query Language

Em outras palavras, temos que procurar por uma coluna (ou grupo de colunas) que apresente um contedo
diferente em cada linha dados que so duplicados em duas linhas. Esta caracterstica ento servir para
identificar a linha da mesma forma que usamos um nome para identificar uma pessoa.
Volte tabela HSPEDE (fig. 1.1). Observe que nem todos os atributos, ou colunas, so igualmente
suficientes para identificar as linhas. Por exemplo, no basta saber apenas o sexo de um hspede que voc
queira identificar se este atributo compartilhado por metade dos seus hspedes. Da mesma forma, se
soubermos o biotipo de um hspede teremos um grupo mais reduzido mas no conseguiremos localizar um
hspede em particular.
O problema que as colunas SEXO e BIOTIPO contm valores duplicados. Quando duas linhas contm o
mesmo atributo, este atributo no pode ser usado para distinguir as linhas entre si.
Concluindo, a nica coluna que pode servir de atributo identificador a coluna NOME. Como no contm
valores duplicados, as informaes nela contidas so por si s suficientes para distinguir a linha de um
hspede na tabela.
Descrevemos, na realidade, uma diferena entre os dois tipos de colunas. O primeiro tipo est baseado em
um atributo que identifique univocamente ou defina uma linha. O segundo tipo baseia-se em atributos
descritivos que fornecem informaes, mas no so suficientes para identificar uma linha ou entidade.
A coluna (ou grupo de colunas) baseada em um atributo identificador de uma linha chamada de Chave ou
Chave Primria. A chave de uma tabela lhe permite identificar as linhas individualmente, definindo
tambm as entidades s quais a tabela se refere. Um banco de dados relacional todas as tabelas tem que ter
uma chave primria que identifique cada linha.

1.5. Chave Primria Composta


A chave primria pode consistir de mais de uma coluna, as vezes no podemos distinguir as linhas uma das
outras usando apenas uma coluna, mais sim mais de uma.
O exemplo a seguir lista o nome de todos os hspedes que chegaram ou saram no perodo entre 01 e
27/08/97; a data de chegada de cada hspede, a data de sada se houver , o quarto e o tcnico de cada
hspede e por ltimo o desconto se houver.

Fig. 1.2 LISTA DE HSPEDES

NOME QUARTO TCNICO CHEGADA SADA DESCTO


JANE FYUNDAI 4 JLIO 15-08-1997 17-08-1997 0.20
MARCELO FREITAS 2 BRUNA 26-08-1997 0.10
ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997
JOS AUGUSTO 3 JLIO 15-08-1997 19-08-1997
MAURCIO DE SOUZA 5 RICARDO 25-08-1997 0.15
BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05
JANE FYUNDAI 7 SERENA 24-08-1997
STELLA SHIELDS 8 SERENA 25-08-1997 0.15
ALEXANDRE GOMES 9 BRUNA 17-08-1997 23-08-1997 0.20

Nenhuma das colunas por si s poder funcionar como chave primria, pois todas elas possuem valores
duplicados, inclusive NOME: Alexandre Gomes e Jane Fyundai estiveram hospedados duas vezes e por
isso aparecem duas vezes na lista. Para estabelecermos uma chave para esta tabela, teremos que usar duas
ou mais colunas conjuntamente. Este tipo de chave, envolvendo duas ou mais colunas, denomina-se chave
composta ou chave primria composta.
No exemplo (Fig. 1.2) as colunas que melhor se candidatam a formar chave composta so NOME e
CHEGADA. O NOME e a CHEGADA combinados lhe permite distinguir uma linha da outra, ou seja, no
h linhas com os valores de NOME e CHEGADA iguais.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 5


SQL - Structure Query Language

2.A Linguagem SQL


SQL uma linguagem prpria para a realizao de operaes relacionais. Em linhas gerais, uma
linguagem para gerenciar um sistema relacional. Atravs das declaraes SQL, dados so recuperados,
atualizados ou eliminados, colunas so alteradas, tabelas so criadas e eliminadas, e qualquer outras
modificaes so efetuadas na estrutura de um banco de dados. As declaraes em SQL podem ser
subdivididas em quatro categorias: queries, definio de dados, manipulao de dados e controle de dados.

2.1. Criando uma Tabela


Usamos a declarao CREATE TABLE para criar uma tabela. As declaraes abaixo criam as duas tabelas
que j vimos anteriormente HSPEDES e LISTA DE HSPEDES. A tabela HSPEDES contm os
dados de todos os hspedes do Visual Spa, passados e atuais. A tabela LISTA DE HSPEDES registra as
datas de entrada e sada, quartos ocupados, etc., de todas as pessoas que se hospedaram no spa no perodo
de 01 e 27/08/1997.
Observe que as declaraes a seguir apenas criam as tabelas. Preench-las com dados constitui uma outra
operao, que veremos posteriormente.
CREATE TABLE HOSPEDES (NOME VARCHAR(25) NOT NULL, SEXO VARCHAR(1),
BIOTIPO VARCHAR(1), ALTURA DECIMAL(3,2));

CREATE TABLE LISTA_DE_HOSPEDES (NOME VARCHAR(25) NOT NULL, QUARTO


VARCHAR(3), TECNICO VARCHAR(8), CHEGADA DATE NOT NULL, SAIDA DATE,
DESCONTO DECIMAL(2,2);
As tabelas HOSPEDES e LISTA_DE_HOSPEDES j existem, embora vazias. A tabela HOSPEDES
consiste das quatro colunas NOME, SEXO, BIOTIPO e ALTURA; a LISTA_DE_HOSPEDES consiste
das seis colunas NOME, QUARTO, TECNICO, CHEGADA, SAIDA e DESCONTO.
Observe que ambas das declaraes CREATE TABLE terminam com um ponto e vrgula (;). Este o sinal
de que a declarao terminou. Embora esta no seja propriamente uma caracterstica da SQL, todas as
implementaes interativas da SQL exigem um sinal indicativo de final de declarao.
Algumas interfaces interativas, oferecem duas formas de marcar o trmino de uma declarao. A primeira e
colocar um ponto e vrgula seguido de um retorno <ENTER> no final da ltima linha da declarao; a
segunda e colocar na linha seguinte ltima linha da declarao uma barra (/) e um retorno <ENTER>
como mostramos nos exemplos abaixo:
SELECT NOME, ALTURA
FROM HOSPEDES;
ou
SELECT NOME, ALTURA
FROM HOSPEDES
/
Ambos os mtodos so muito usados, nesta apostila terminamos as declaraes normalmente com o ponto e
vrgula. No existe regra quanto ao nmero de linhas de uma declarao SQL. Poderamos ter escrito a
declarao toda em uma linha s, o que ocuparia menos espao. O ponto e vrgula ou a barra obrigatrio
somente no final da ltima linha da declarao.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 6


SQL - Structure Query Language

2.2. Identificadores e Atributos


Observe os dois traos sublinhados ( ___ ) ligando as trs palavras que compes o nome da tabela
LISTA_DE_HOSPEDES. O trao sublinhado um meio convencional para representar o espao nos
nomes de tabelas ou colunas que contm mais de uma palavra. Ele tm por finalidade ligar uma palavra
outra, fazendo com que formem apenas um conjunto de caracteres, podendo se reconhecidas portanto como
partes integrantes de um nico nome.

2.3. Tipos de Dados


A SQL padro da ANSI reconhece dois tipos genricos de dados seqncias (strings) de caracteres de
dados numricos , e oferece vrios tipos particulares com diferentes caractersticas para atender s
necessidades de cada coluna. Estes incluem CHAR (ou CHARACTER), para seqncias de caracteres, e os
tipos NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION, para
dados numricos.
Existem diversos tipos de dados implementados para duas outras categorias de dados. Uma delas abrange
os dados tipo data e hora, representados em SQL Base pelos tipos DATE, TIME, TIMESTAMP; a outra
o tipo de dado LONG VARCHAR ou LONG, tipo genrico que pode armazenar qualquer categoria de
dados, inclusive dados binrios. Em SQL Base, os dados do tipo LONG podem ter um tamanho virtual
qualquer (bilhes de bytes); em outras implementaes, o limite normalmente de 64 Kbytes.

2.3.1. Dados Caracteres Strings


O tipo CHAR armazena seqncias de caracteres de tamanho fixo que consistem de letras, caracteres
especiais ou dgitos, e cujo tamanho no pode ultrapassar 254 bytes. O tamanho mximo (at 255
caracteres) a ser aceito em uma coluna deve ser definido quando, ao cri-la, especificamos o atributo de
tamanho. Todos os dados desta coluna so armazenados com o tamanho indicado quando da sua definio.
Em SQL padro, quando um dado possui um tamanho menor ao especificado para a coluna, espaos em
branco so acrescentados direita. Em SQL Base, estes dados podem definidos como CHAR ou
VARCHAR.

2.3.2. Dados Numricos


O tipo NUMBER armazena nmeros de 1.0E-100 a 1.0E+100, com, no mximo, 22 dgitos decimais de
preciso. As colunas deste tipo no possuem indicaes de preciso e escala em suas definies.
O tipo DECIMAL armazena nmeros de 1.0E-100 a 1.0E+100, com no mximo 22 dgitos decimais de
preciso, mas, ao contrrio do tipo NUMBER, as colunas DECIMAL tm que ter indicaes de preciso e
escala em suas definies.
O tipo INTEGER armazena um nmero com at dez dgitos de preciso. No so aceitos dgitos
fracionrios; os algarismos direita do ponto decimal so truncados.
O tipo SMALLINT armazena um nmero com at cinco dgitos de preciso. Da mesma forma que o tipo
INTEGER, no so aceitos dgitos fracionrios, os quais so truncados.
O tipo FLOAT armazena um nmero decimal de ponto flutuante de dupla preciso ou preciso simples,
dependendo da especificao de tamanho.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 7


SQL - Structure Query Language

2.3.3. Dados Data e Hora


O tipo DATE armazena datas, que podem ser codificadas e exibidas em diversos formatos.
O tipo TIME armazena horas, registrando at os microssegundos, sendo que podem tambm ser
codificados e exibidas em diversos formatos.
O tipo TIMESTAMP usado em colunas criadas para armazenar data e hora ao mesmo tempo. Este tipo
uma combinao dos formatos DATE e TIME, sendo que os dados contm ambos os componentes data e
hora.
Veja na tabela seguinte os formatos de datas convencionais mais importantes:
Tabela Formatos de Datas

Nome Formato Exemplo


Organizaes de Padres Intern. aaaa-mm-dd 1998-10-30
Padro IBM EUA (USA) mm/dd/aaaa 10/30/1998
Padro IBM Europa (EUR) dd.mm.aaaa 30.10.1998
Padro Industrial Japons (JIS) aaaa-mm-dd 1998-10-30

Veja na tabela seguinte os formatos de datas convencionais mais importantes:


Tabela Formatos de Horas

Nome Formato Exemplo


Organizaes de Padres Intern. hh.mm.ss 14.30.02
Padro IBM EUA (USA) hh:mm AM ou PM 2:30 PM
Padro IBM Europa (EUR) hh.mm.ss 14.30.02
Padro Industrial Japons (JIS) hh:mm:ss 14:30:02

2.4. Incluindo Dados


A declarao CREATE TABLE mostrada no incio apenas criou as tabelas HOSPEDES e
LISTA_DE_HOSPEDES, sem preench-las com dados. Para incluir dados nas tabelas, usamos uma outra
declarao ou comando.
Na linguagem SQL a nica forma de incluir dados atravs da declarao INSERT, que normalmente
inclui uma nica linha de cada vez. S pode ser utilizada para incluir vrias linhas se nela for inserida uma
query que recupere de outra tabela os dados a serem includos.
A declarao SQL abaixo ilustra a incluso de uma nica linha de dados na tabela
LISTA_DE_HOSPEDES. A linha consiste de seis itens de dados, separados por vrgulas um item para
cada uma das seis colunas da tabela LISTA_DE_HOSPEDES. O primeiro item de dados includo na
primeira coluna da tabela, o segundo item na segunda coluna, e assim por diante, como se segue:
INSERT INTO LISTA_DE_HOSPEDES (NOME, QUARTO, TECNICO, CHEGADA, SAIDA,
DESCONTO)
VALUES (CLOVIS ALMEIDA, 3, JULIO, 13-08-1997, 17-08-1997, .2;

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 8


SQL - Structure Query Language

Como estamos incluindo dados em todas as colunas da tabela LISTA_DE_HOSPEDES, poderamos omitir
a lista dos nomes das colunas aps o nome da tabela. Esta lista s indispensvel caso estejamos incluindo
dados em apenas algumas colunas e no em todas; temos ento que indicar os nomes das colunas que
recebero dados. Nomeamos todas as colunas neste exemplo simplesmente para facilitar anlise da
declarao.
Observe que os dados referentes s colunas NOME, QUARTO e TECNICO esto entre apstrofes (). Isto
se deve ao fato de que os dados das trs colunas so do tipo VARCHAR. Dados CHAR ou VARCHAR
usados em declaraes SQL devem aparecer entre apstrofes.

3.Queries: Obtendo os Dados Desejados


A query o meio atravs do qual podemos pesquisar e obter dados das tabelas de um banco de dados. A
seguir abordamos os seus elementos bsicos, inclusive as duas clusulas essenciais obrigatrias em todas as
queries e uma terceira que contm a especificao das linhas em que esto os dados desejados.

3.1. Clusulas SELECT e FROM


Por mais bsica que seja, uma query tem que ter pelo menos dois componentes uma clusula SELECT e
uma clusula FROM. Em uma query simples, a clusula SELECT enumera os nomes das colunas que
contm os dados desejados, e a FROM especifica as tabelas em que esto localizadas as colunas.
A query mais simples possvel seleciona todos os dados de todas as colunas da tabela. Entretanto, podemos
restringir a clusula SELECT de modo que se obtenha dados de apenas algumas colunas, ou, de outras
formas, acrescentando qualificaes. Podemos citar na clusula SELECT colunas de mais de uma tabela,
alm de especificar vrias operaes a serem executadas sobre os dados e exibir os resultados das mesmas.
O resultado da query exibido em forma de tabela e , s vezes, chamado de tabela resultado. As linhas do
resultado representam os dados que atendem s condies estabelecidas ou so o produto das operaes
especificadas na query. Se no houver dados em nenhuma destas situaes, no sero selecionadas linhas.
Analisemos um exemplo de uma query e seu resultado.
SELECT NOME, QUARTO, TECNICO, CHEGADA, SAIDA, DESCONTO
FROM LISTA_DE_HOSPEDES;

NOME QUARTO TCNICO CHEGADA SADA DESCTO


JANE FYUNDAI 3 JLIO 15-08-1997 17-08-1997 0.20
MARCELO FREITAS 2 BRUNA 26-08-1997 0.10
JANE FYUNDAI 4 SERENA 24-08-1997
ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997
JOS AUGUSTO 7 JLIO 15-08-1997 19-08-1997
MAURCIO DE SOUZA 5 RICARDO 25-08-1997 0.15
BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05
STELLA SHIELDS 8 SERENA 25-08-1997 0.15
ALEXANDRE GOMES 9 BRUNA 17-08-1997 23-08-1997 0.20
A query acima solicita todas as linhas de dados para todas as colunas da tabela LISTA_DE_HOSPEDES.
No acrescentamos qualificaes, e, portanto, o resultado contm todos os dados destas colunas.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 9


SQL - Structure Query Language

Incidentemente, podemos usar um asterisco (*) em vez de nomes de colunas na clusula SELECT. O
asterisco representa os valores de todas as colunas. Usar o asterisco o mesmo que nomear todas as
colunas de uma tabela ou mais tabelas, na sua ordem original. Portanto, ao invs de digitar todos os nomes
de colunas como fizemos no exemplo anterior, poderamos ter obtido o mesmo resultado codificando a
query assim:
SELECT *
FROM LISTA_DE_HOSPEDES;
Podemos selecionar de apenas algumas colunas e omitir outras. A query a seguir obtm os dados somente
da coluna NOME:
SELECT NOME
FROM LISTA_DE_HOSPEDES;
Podemos evitar que dados sejam exibidos duplicados, usando a palavra-chave DISTINCT imediatamente
aps a palavra SELECT na clusula SELECT para suprimir as linhas duplicadas do resultado. No
exemplo abaixo a palavra-chave DISTINCT foi acrescentada na query anterior:
SELECT DISTINCT NOME
FROM LISTA_DE_HOSPEDES;

A palavra-chave DISTINCT suprime apenas as linhas duplicadas do resultado, e no valores duplicados.

3.2. Clusula WHERE


A clusula WHERE reduz o escopo da query focalizando apenas determinadas linhas. Ao invs de retornar
os valores das expresses da clusula SELECT de todas as linhas, uma query com uma clusula WHERE
retorna apenas os valores das linhas que atendam s condies especificadas na clusula WHERE.
Em outras palavras, uma query contendo a clusula WHERE tem essencialmente o seguinte formato:
SELECT o valor das expresses
FROM estas tabelas
somente nas linhas WHERE estas condies foram atendidas.

As condies da clusula WHERE so chamadas de condies de pesquisa. O exemplo abaixo seleciona


dados das colunas NOME e TECNICO da tabela LISTA_DE_HOSPEDES somente nas linhas em que o
tcnico for a Bruna. Em outras palavras, a query lista os nomes (e tcnicos) de todas as pessoas cujo o
tcnico seja a Bruna:
SELECT NOME, TECNICO
FROM LISTA_DE_HOSPEDES
WHERE TECNICO = BRUNA;

NOME TCNICO
MARCELO FREITAS BRUNA
BIANCA OLIVEIRA BRUNA
ALEXANDRE GOMES BRUNA
No obrigatrio citar na clusula WHERE somente colunas que apaream na clusula SELECT. A query
anterior funcionaria da mesma forma se eliminssemos a coluna TECNICO da clusula SELECT.
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE TECNICO = BRUNA;

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 10


SQL - Structure Query Language

NOME
MARCELO FREITAS
BIANCA OLIVEIRA
ALEXANDRE GOMES

3.2.1. Predicados Relacionais


No exemplo anterior, TECNICO = BRUNA um predicado relacional. O sinal de igualdade (=) um
operador relacional simples.
Existem nove operadores relacionais simples, que podem formar nove tipos de predicados relacionais
simples para expressar condies de pesquisa. Existem ainda cinco outros tipos de predicados relacionais.
Discutiremos todos os tipos existentes nos prximos tpicos.
Predicados Relacionais Simples
A query utilizada no ltimo exemplo foi:
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE TECNICO = BRUNA;
Como j foi dito, a query contm um operador relacional simples, o sinal de igualdade. Seu significado
seria traduzido assim:
SELECT o valor de NOME e TECNICO
FROM tabela LISTA_DE_HOSPEDES
somente nas linhas WHERE o valor de TECNICO seja igual a BRUNA;

Os operadores relacionais simples so os nove abaixo:


= igual a > maior que !< no menor que
!= no igual a !> no maior que >= maior ou igual a
<> no igual a < menor que <= menor ou igual a

3.2.2. Outros Predicados Relacionais


Alm dos operadores j discutidos, h outros cinco que tambm podem ser usados para formar predicados
relacionais. So eles:
BETWEEN...AND
IS NULL
LIKE
IN

O operador BETWEEN especifica os dados compreendidos em uma determinada faixa. Pode ser usado
tanto com nmeros quanto com datas. Por exemplo, poderamos obter os nomes e os percentuais de
desconto de todos os hspedes que tenham recebido de 10 a 20 por cento inclusive, como se segue:
SELECT NOME, DESCONTO
FROM LISTA_DE_HOSPEDES
WHERE DESCONTO BETWEEN .10 AND .20;

NOME DESCTO
JANE FYUNDAI 0.20
MARCELO FREITAS 0.10
MAURCIO DE SOUZA 0.15
STELLA SHIELDS 0.15
ALEXANDRE GOMES 0.20
Podemos solicitar tambm os nomes e as datas de sada de todos os hspedes que saram do Spa entre 19 e
24 de agosto:

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 11


SQL - Structure Query Language

SELECT NOME, SAIDA


FROM LISTA_DE_HOSPEDES
WHERE SAIDA BETWEEN 19-08-1997 AND 24-08-1997;

NOME SAIDA
JOSE AUGUSTO 19-08-1997
BIANCA OLIVEIRA 20-08-1997
ALEXANDRE GOMES 23-08-1997

O operador IS NULL nos permite selecionar as linhas em que o valor de um determinado campo seja
desconhecido. Por exemplo, as linhas de vrios hspedes ficaram com a SAIDA em branco. Podemos
selecionar os nomes destes hspedes utilizando o operador IS NULL.
SELECT NOME, SAIDA
FROM LISTA_DE_HOSPEDES
WHERE SAIDA IS NULL;

NOME SAIDA
MARCELO FREITAS
JANE FYUNDAI
STELLA SHIELDS

O operador LIKE nos permite utilizar caracteres mscara para comparar dados em uma condio de
pesquisa. Em vez de os dados terem que ser idnticos, podemos especificar que sejam apenas semelhantes
em algum aspecto.
Podemos usar os dois caracteres mscara abaixo com o operador LIKE:
_ (sublinhado) Vale por qualquer caractere nico
* (asterisco) Vale por qualquer seqncia de caracteres
No contexto de um LIKE, o caractere de sublinhado ( _ ) funciona analogamente ao ponto de interrogao
(?) do MS-DOS, que serve de caractere mscara em nomes de arquivos, e o smbolo de percentual (%)
funciona analogamente ao asterisco (*).
O exemplo de query abaixo usa o operador LIKE e um caractere mscara para selecionar todos os nomes
que comecem com a seqncia de caracteres MA%;
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE NOME LIKE MA%;

NOME
MARCELO FREITAS
MAURICIO DE SOUZA
A prxima query seleciona todos os nomes que tenham a letra J na primeira posio e N na quarta, no
importando quais sejam os outros caracteres.
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE NOME LIKE J__N;

NOME
JANE FYUNDAI
Mais um exemplo:
SELECT NOME
FROM LISTA_DE_HOSPEDES
WHERE NOME LIKE _AR_E%;

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 12


SQL - Structure Query Language

NOME
MARCELO FREITAS

O ltimo operador a ser discutido neste tpico o IN, que nos permite selecionar dados que se encaixem
em um conjunto ou uma lista de valores. Os valores podem ser indicados explicitamente em uma
declarao, como nos exemplos a seguir.
A query abaixo seleciona o nome, o tcnico e o quarto de cada hspede cujo o tcnico esteja presente na
lista BRUNA, JULIO:
SELECT NOME, TECNICO, QUARTO
FROM LISTA_DE_HOSPEDES
WHERE TECNICO IN (BRUNA, JULIO);

NOME TCNICO QUARTO


JANE FYUNDAI JLIO 3
MARCELO FREITAS BRUNA 2
JOS AUGUSTO JLIO 4
BIANCA OLIVEIRA BRUNA 6
ALEXANDRE GOMES BRUNA 9

Todos os operadores relacionais tambm podem ser utilizados com o NOT. Na query abaixo, selecionamos
o nome, o tcnico e o quarto dos hspedes cujo o tcnico no esteja includo na lista:
SELECT NOME, TECNICO, QUARTO
FROM LISTA_DE_HOSPEDES
WHERE TECNICO NOT IN (BRUNA, JULIO);

NOME QUARTO TCNICO


ALEXANDRE GOMES 1 RICARDO
MAURCIO DE SOUZA 5 RICARDO
JANE FYUNDAI 7 SERENA
STELLA SHIELDS 8 SERENA

3.2.3. Vinculando Vrios Predicados: AND e OR


Podemos restringir ainda mais a seleo de linhas usando uma clusula WHERE com mais de uma
condio de pesquisa. Isto se faz possvel atravs dos operadores AND e OR.
Na query abaixo, selecionamos o nome, o tcnico e o desconto dos hspedes que ainda esto no Spa e cujo
o tcnico seja Serena:
SELECT NOME, TECNICO, DESCONTO
FROM LISTA_DE_HOSPEDES
WHERE SAIDA IS NULL AND TECNICO = SERENA

NOME TCNICO DESCTO


JANE FYUNDAI SERENA
STELLA SHIELDS SERENA 0.15

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 13


SQL - Structure Query Language

Podemos acrescentar inmeras condies clusula WHERE usando os operadores AND e OR. A prxima
query acrescenta vrios componentes:
SELECT NOME, QUARTO, TECNICO, CHEGADA, SAIDA
FROM LISTA_DE_HOSPEDES
WHERE SAIDA IS NULL
AND TECNICO = ROBERTO
AND QUARTO > 16
AND CHEGADA < 20-08-97;

4.Queries: Manipulando Dados


A linguagem SQL no nos limita a selecionar os dados exatamente na forma que aparecem nas tabelas.
Como mencionamos anteriormente, podemos usar queries tambm para selecionar os resultados de
operaes realizadas sobre os dados.
Neste tpico, descrevemos trs elementos que viabilizam as operaes realizadas sobre os dados em uma
query. So eles:
Operador aritmtico;
Funes agregadas;
Funes no agregadas.
Em cada caso, o operador ou funo usado com constantes, nomes de colunas e assim por diante para
formar uma expresso nova.

4.1. Operadores Aritmticos


So quatro os operadores aritmticos que podem formar expresses:
+ adio
- subtrao
* multiplicao
/ diviso
A query abaixo, usamos o operador de soma para adicionar 0.05 (uma constante) ao valor corrente de
DESCONTO na linha de Marcelo Freitas. A clusula SELECT contm duas expresses: NOME e a
expresso formada pelo operador aritmtico, DESCONTO + 0.05. A tabela resultado dever conter duas
colunas, uma para cada expresso:
SELECT NOME, DESCONTO + 0.05
FROM LISTA_DE_HOSPEDES
WHERE NOME = MARCELO FREITAS

NOME DESCTO
MARCELO FREITAS 0.15

Embora as regras variem de implementao para implementao, algumas permitem ainda o uso de
operadores aritmticos com dados do tipo data e hora. Em SQL Base, por exemplo, a query abaixo pode ser
usada para determinar por quantos dias ficaram no Spa os hspedes que j foram embora. Este nmero
obtido subtraindo-se a data de chegada de sada. Outras implementaes permitem queries semelhantes,
mas no idnticas.
SELECT NOME, SAIDA - CHEGADA
FROM LISTA_DE_HOSPEDES
WHERE NOME = MARCELO FREITAS

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 14


SQL - Structure Query Language

4.2. Funes
As funes constituem mais uma forma de usar queries para manipular os dados das tabelas. Uma funo
retorna o valor resultante de uma determinada operao realizada sobre o seu argumento (ou argumentos).
Uma funo, como o seu argumento, representa um valor e portanto uma expresso.

4.2.1. Funes Agregadas


A caracterstica marcante das funes agregadas que produzem um nico valor a partir de uma coluna
inteira de dados. Portanto, enquanto qualquer outro tipo de expresso retorna um valor para cada linha, as
funes agregadas retornam um valor que representa um agregado dos valores referentes s vrias linhas.
Por esta razo, so tambm chamadas de funes de colunas.
Existem cinco funes agregadas. So elas:
AVG(argumento) Retorna a mdia dos valores do argumento
MAX(argumento) Retorna o maior valor do argumento
MIN(argumento) Retorna o menor valor do argumento
SUM(argumento) Retorna o somatrio dos valores do argumento
COUNT(argumento) Retorna a nmero de linhas do argumento
As funes agregadas normalmente usam como argumento um nome de coluna ou uma expresso que
tenha um nome de coluna como componente, mas podemos us-las com qualquer expresso numrica ou
de datas.
A query a seguir l todos os valores da coluna DESCONTO e fornece os percentuais mdio, mximo e
mnimo de desconto oferecidos aos hspedes do Visual Spa. Como as funo AVG, MX, MIN e SUM
ignoram valores nulos, o valor AVG (mdia) realmente o desconto mdio apenas daqueles hspedes que
obtiveram algum desconto:
SELECT AVG(DESCONTO), MAX(DESCONTO), MIN(DESCONTO)
FROM LISTA_DE_HOSPEDES;

AVG(DESCONTO) MAX(DESCONTO) MIN(DESCONTO)


0.115635 0.20 0.05
Outros exemplos:
SELECT MIN(DESCONTO) * AVG(SAIDA-CHEGADA)
FROM LISTA_DE_HOSPEDES
WHERE TECNICO = SENERA;

4.2.2. Funes No Agregadas


As funes no agregadas diferem das agregadas pelo fato de que no fornecem um nico valor a partir de
uma coluna inteira de dados. Em vez disto, as funes no agregadas, como todas as expresses que j
discutimos (exceto as funes agregadas), retornam um valor para cada linha.
Em SQL Base, as funes agregadas comeam sempre com o caractere @, mas esta conveno s
pertence ao SQL Base. Nos outros aspectos, a sintaxe das funes no agregadas igual a das agregadas: a
funo seguida de seu argumento entre parnteses, por exemplo, @PROPER(JOSE AUGUSTO).
Da mesma forma que as funes agregadas, as no agregadas podem ser usadas uma dentro da outra, de
modo que o resultado da funo interna seja usado como argumento da externa. Por exemplo, na funo:
@PROPER(@LEFT(JOSE AUGUSTO, 4))
@LEFT retorna os cinco primeiros caracteres da seqncia JOSE AUGUSTO (JOSE), os quais
compes o argumento da funo @PROPER. Esta funo coloca apenas a primeira letra de cada palavra de
seu argumento em letra maiscula e as restantes em letra minscula, como na representao de nomes
prprios. Neste caso, @PROPER converte JOSE em Jose.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 15


SQL - Structure Query Language

4.2.3. Funes de Seqncias de Caracteres


Como as funes no agregadas variam muito de implementao para implementao, esta apostila no se
dispes a examin-las detalhadamente. Apresentamos neste prximo tpico apenas alguns exemplos
representativos oferecidos pelo SQL Base.
O exemplo abaixo usa a funo @LENGTH (seqncia de caracteres). Colocamos a expresso seqncia
de caracteres entre parnteses para indicar que esta funo utiliza seqncias de caracteres como
argumentos. Ela retorna o nmero de caracteres existentes no argumento. Neste caso, usamos a funo para
informar o nmero de caracteres de cada NOME da tabela LISTA_DE_HOSPEDES:
SELECT NOME, @LENGTH(NOME)
FROM LISTA_DE_HOSPEDES;

NOME @LENGTH (NOME)


JANE FYUNDAI 12
MARCELO FREITAS 15
JOS AUGUSTO 12
BIANCA OLIVEIRA 15
ALEXANDRE GOMES 15

SELECT NOME, @PROPER(@LENGTH(NOME,5))


FROM LISTA_DE_HOSPEDES;

NOME @PROPER(@LENGTH (NOME,5))


JANE FYUNDAI jane
MARCELO FREITAS marce
JOS AUGUSTO jos
BIANCA OLIVEIRA bianc
ALEXANDRE GOMES alexan

4.2.4. Funes de Data e Hora


So funes que retornam informaes sobre uma coluna de dados do tipo data ou hora ou geram
resultados do tipo data ou hora.
A funo de data @DAY(data), por exemplo, seleciona apenas o dia do ms da DATA:
SELECT NOME, CHEGADA, @DAY(CHEGADA)
FROM LISTA_DE_HOSPEDES;

NOME CHEGADA @DAY(CHEGADA)


JANE FYUNDAI 15-08-1997 15
MARCELO FREITAS 26-08-1997 26
ALEXANDRE GOMES 14-08-1997 14
JOS AUGUSTO 15-08-1997 15
Queries semelhantes podem ser criadas com as funes @MONTH, @YEAR, @HOUR, @MINUTE e
@SECOND.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 16


SQL - Structure Query Language

5.Organizando o Resultado

5.1. Clusula GROUP BY


A clusula GROUP BY rene diferentes linhas do resultado de uma query em conjuntos de acordo com as
colunas nela mencionadas, chamadas colunas formadoras de grupos. As linhas so agrupadas de duas
formas, ou em dois aspectos.
A query abaixo exemplifica a primeira forma, na qual todas as linhas que contm o mesmo valor na
primeira coluna especificada so exibidas em grupos no resultado. Neste caso, a primeira coluna formadora
de grupo TECNICO. Todas as linhas que tenham o mesmo valor na coluna TECNICO aparecero juntas
no resultado:
SELECT TECNICO, NOME
FROM LISTA_DE_HOSPEDES
GROUP BY TECNICO, NOME;

TCNICO NOME
BRUNA MARCELO FREITAS
BRUNA BIANCA OLIVEIRA
BRUNA ALEXANDRE GOMES
JLIO JANE FYUNDAI
JLIO JOS AUGUSTO
RICARDO ALEXANDRE GOMES
RICARDO MAURCIO DE SOUZA
SERENA JANE FYUNDAI
SERENA STELLA SHIELDS
Se houvesse linhas em que a coluna TECNICO estivesse em branco, ou seja, com um valor nulo para
TECNICO, tambm seriam agrupadas. E as linhas so agrupadas da mesma maneira para cada coluna
formadora de grupos subseqente, embora isto no esteja aparente no exemplo dados pois s contm duas
colunas.
Obs.: As funes agregadas AVG, SUM, MAX, MIN e COUNT no podem ser usadas em clusulas
GROUP BY pois geram um nico valor e por isso no podem agrupar linhas.
A clusula GROUP BY tambm pode ser usada em queries contendo uma clusula WHERE. Neste caso, a
GROUP BY codificada depois da clusula WHERE. Por exemplo, a query abaixo exibe os nomes dos
hspedes que chegaram depois do dia 15 de agosto por tcnico:
SELECT TECNICO, NOME
FROM LISTA_DE_HOSPEDES
WHERE CHEGADA > 15-08-97
GROUP BY TECNICO, NOME;

5.2. Clusula HAVING


A clusula HAVING nos permite estreitar a rea de atuao da clusula GROUP BY da mesma forma que
a clusula WHERE estreita a rea de atuao da clusula SELECT, ou seja, atravs de uma condio de
pesquisa.
Ao contrrio da clusula WHERE, no entanto, a clusula HAVING pode conter funes agregadas.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 17


SQL - Structure Query Language

Uma nova tabela, HOSPEDES_PS, ser usada nos exemplos deste tpico. Criamos uma tabela com a
declarao CREATE TABLE abaixo. Esta tabela se destina a registrar as pesagens peridicas dos hspedes
do Visual Spa.
CREATE TABLE HOSPEDE_PS (HOSPEDE VARCHAR(25) NOT FULL, PESO
DECIMAL(4,1), QUANDO DATE);

Chamamos a coluna DATE de QUANDO porque DATE uma palavra reservada. As palavras
reservadas no podem ser usadas como nomes de colunas ou outros identificadores, a no ser que entre
aspas.
Aps a incluso dos dados, a tabela HOSPEDE_PS tem a seguinte aparncia:
SELECT * FROM HOSPEDE_PS

NOME PESO QUANDO


JANE FYUNDAI 68 14-08-97
MARCELO FREITAS 59 14-08-97
ALEXANDRE GOMES 86 15-08-97
JOS AUGUSTO 87 15-08-97
MAURCIO DE SOUZA 68.5 15-08-97
JANE FYUNDAI 67.5 16-08-97
MARCELO FREITAS 55 16-08-97
ALEXANDRE GOMES 84 17-08-97
JOS AUGUSTO 84 17-08-97
MAURCIO DE SOUZA 67 17-08-97
A tabela contm dois registros de peso para cada estada: um na data de entrada e outro na data de sada. A
query a seguir indica os hspedes que tiveram uma diferena acima de um entre seu peso mnimo e seu
peso mximo. Observe a presena de funes agregadas na clusula HAVING.
SELECT HOSPEDE, MIN(PESO), MAX(PESO) MIN(PESO)
FROM HOSPEDE_PS
GROUP BY HOSPEDE
HAVING MAX(PESO) MIN(PESO) > 1;

NOME MIN(PESO) MAX(PESO MAX(PESO)-MIN(PESO)


)
MARCELO FREITAS 55 59 4
ALEXANDRE GOMES 84 86 2
JOS AUGUSTO 84 87 3
MAURCIO DE SOUZA 67 68.5 1.5

Passemos para um outro exemplo. Esta query solicita o nmero de hspedes orientados por cada tcnico
que trabalhou com mais de dois hspedes:
SELECT HOSPEDE, COUNT(NOME)
FROM HOSPEDE_PS
GROUP BY HOSPEDE
HAVING CONT(NOME) > 2;

5.3. Clusula ORDER BY


A clusula ORDER BY nos permite classificar as linhas do resultado alfabtica e numericamente, em
ordem crescente ou decrescente. O default a ordem crescente. A clusula ORDER BY sempre a ltima
clusula da query.
No exemplo a seguir, obtemos os nomes dos hspedes classificados em ordem decrescente colocando a
palavra DESC na clusula ORDER BY depois do nome da coluna a ser ordenada. Usamos a palavra-chave
DISTINCT para suprimir as linhas duplicadas:

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 18


SQL - Structure Query Language

SELECT DISTINCT NOME


FROM LISTA_DE_HOSPEDES
ORDER BY NOME DESC;

NOME
STELLA SHIELDS
MAURCIO DE SOUZA
MARCELO FREITAS
JOS AUGUSTO
JANE FYUNDAI
JANE FYUNDAI
BIANCA OLIVEIRA
ALEXANDRE GOMES
ALEXANDRE GOMES

As classificaes so, por default, efetuadas em ordem crescente, a no ser que seja indicada a palavra-
chave DESC aps o nome da coluna. Porm, podemos tambm explicitar a ordem crescente para uma
determinada coluna, usando-se a palavra-chave ASC aps o nome da coluna na clusula ORDER BY.

6.Junes: Queries que Envolvem Mais de uma Tabela


Por muitas vezes, os dados que desejamos no esto contidos em uma s tabela. Por exemplo, para obter a
altura e o nome do tcnico de Bianca Oliveira, temos que pesquisar em duas tabelas. O nome de seu tcnico
est registrado na tabela LISTA_DE_HOSPEDES, mas sua altura s est contida na tabela HOSPEDES.
Esta ltima, a qual j foi vista em tpicos anteriores, tem a seguinte aparncia:
SELECT * FROM HOSPEDES;

NOME SEXO BIOTIPO ALTURA


JOS AUGUSTO M M 1,67
MAURCIO DE SOUZA M M 1,72
BIANCA OLIVEIRA F G 1,65
JANE FYUNDAI F G 1,80
STELLA SHIELDS F M 1,65
ROGRIO NUNES M M 1,78
A query a seguir obtm a altura de Rogrio Nunes :
SELECT NOME, ALTURA
FROM HOSPEDES
WHERE NOME = BIANCA OLIVEIRA;

NOME ALTURA
BIANCA OLIVEIRA 1,65
A prxima query obtm seu tcnico da tabela LISTA_DE_HOSPEDES:
SELECT NOME, TECNICO
FROM LISTA_DE_HOSPEDES
WHERE NOME = BIANCA OLIVEIRA;

NOME TECNICO
BIANCA OLIVEIRA BRUNA

Podemos, no entanto, obter as mesmas informaes de uma s vez atravs de uma query chamada juno.
Uma juno uma query que obtm dados de mais de uma tabela ao mesmo tempo, baseando-se na
condio de juno indicada na clusula WHERE. Temos abaixo uma juno que fornece a altura e o
tcnico de todos os hspedes:
SELECT HOSPEDES.NOME, ALTURA, TECNICO

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 19


SQL - Structure Query Language

FROM HOSPEDES, LISTA_DE_HOSPEDES


WHERE HOSPEDES.NOME = LISTA_DE_HOSPEDES.NOME;

NOME TCNICO ALTURA


JANE FYUNDAI JLIO 1,80
JOS AUGUSTO JLIO 1,67
MAURCIO DE SOUZA RICARDO 1,72
BIANCA OLIVEIRA BRUNA 1,65
STELLA SHIELDS SERENA 1,65

Podemos traduzir a query da seguinte maneira: Para todas as linhas de HOSPEDES e


LISTA_DE_HOSPEDES cujo o valor de HOSPEDES.NOME seja igual ao de
LISTA_DE_HOSPEDES.NOME, obtenha os respectivos NOME e ALTURA de HOSPEDES e o
TECNICO de LISTA_DE_HOSPEDES.

6.1. Equijunes
A ltima query que analisamos um exemplo de equijuno uma juno baseada em uma condio de
igualdade. Outros tipos de predicados relacionais podem constituir outros tipos de condio de juno, dos
quais veremos alguns exemplos. Porm de antemo sabemos que o tipo mais comum o de igualdade a
equijuno.
Para que possamos dar um exemplo um pouco diferente, criaremos uma nova tabela, QUARTOS, que ir
conter detalhes das acomodaes do Visual Spa. A declarao utilizada para cri-la a seguinte:
CREATE TABLE QUARTOS (QUARTO VARCHAR(3), NOME VARCHAR(15),
TAXA FLOAT, DESCRICAO LONG VARCHAR);
A tabela em questo preenchida com dados, excetuando-se a coluna de tipo LONG, tem a seguinte
aparncia:
SELECT QUARTO, NOME, TAXA
FROM QUARTOS;

QUARTO NOME TAXA


1 ANA PAULA 300
2 CARMEM SOUZA 300
3 CRISTIANO BEZERRA 250
4 MARCONE ALMEIDA 325
5 MARIA FERREIRA 250

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 20


SQL - Structure Query Language

Segue-se ento o exemplo de equijuno. Para efeito de demonstrao, a equijuno encontra-se em


uma clusula AND. Observe, tambm, que nenhuma das duas colunas unidas, QUARTO da tabela
QUARTOS e da LISTA_DE_HOSPEDES, aparece na lista do SELECT.
SELECT LISTA_DE_HOSPEDES.NOME, QUARTOS.NOME, QUARTOS.TAXA,
LISTA_DE_HOSPEDES.DESCONTO
FROM QUARTOS, LISTA_DE_HOSPEDES
WHERE LISTA_DE_HOSPEDES.NOME = JANE FYUNDAI
AND QUARTOS.QUARTO = LISTA_DE_HOSPEDES.QUARTO;

LISTA_DE_HOSPEDES. QUARTOS.NOME QUARTOS.TAXA LISTA_DE_HOSPEDES.


NOME DESCTO
JANE FYUNDAI MARCONE ALMEIDA 325 0.20

6.2. Junes Externas


Suponhamos que quisssemos saber o nome, o sexo, o biotipo, a altura e o tcnico de cada um dos
hspedes do Visual Spa. Os tcnicos so indicados na tabela LISTA_DE_HOSPEDES, a qual contm
informaes sobre hspedes atuais; as outras informaes esto contidas na tabela HOSPEDES, que
contm os registros de todos os hspedes, atuais e passados.
Podemos, para isso, usar esta query, uma simples equijuno:

SELECT HOSPEDES.NOME, SEXO, BIOTIPO, ALTURA, TECNICO


FROM HOSPEDES, LISTA_DE_HOSPEDES
WHERE HOSPEDES.NOME = LISTA_DE_HOSPEDES.NOME;

NOME SEXO BIOTIPO ALTURA TECNICO


JOS AUGUSTO M M 1,67 JULIO
MAURCIO DE SOUZA M M 1,72 RICARDO
BIANCA OLIVEIRA F G 1,65 BRUNA
JANE FYUNDAI F G 1,80 JULIO
STELLA SHIELDS F M 1,65 SERENA
ROGRIO NUNES M M 1,78 SERENA
CLINT WESTWOOD M M 1,85 RICARDO
Uma juno externa nos permite unir tabelas atravs de colunas com nmeros diferentes de linhas, sem que
as linhas comuns s duas sejam excludas da tabela resultado. Ao contrrio, as linhas exclusivas de apenas
uma das tabelas so includas no resultado, com valores nulos em quaisquer colunas da outra tabela, onde
aquelas linhas no existem.
O recurso de junes externas s existe em poucas implementaes da linguagem SQL. Entretanto, por
consider-lo importante e como possivelmente ser implementado em maior escala no futuro, vamos
analisar como efetuado este tipo de juno no SQL Base.
A sintaxe SQL Base para converter o exemplo anterior em uma juno externa a fim de incluir as demais
linhas da tabela no contidas no resultado simples: basta acrescentar um sinal de adio (+) ao lado do
nome da coluna que no possui as linhas externas, ou seja, aquela na qual incluiremos valores nulos no
resultado, na condio de juno. Ex.:
SELECT HOSPEDES.NOME, SEXO, BIOTIPO, ALTURA, TECNICO
FROM HOSPEDES, LISTA_DE_HOSPEDES
WHERE HOSPEDES.NOME = LISTA_DE_HOSPEDES.NOME(+);

6.3. Auto-Junes
Por muitas vezes, precisamos fazer uma juno de uma tabela com ela mesma. Esta uma forma de
tratarmos uma nica tabela como se fosse na verdade duas tabelas, a fim de possibilitar certos tipos de
queries.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 21


SQL - Structure Query Language

Suponhamos que quisssemos selecionar todos os hspedes que tenham obtido o mesmo percentual de
desconto que Maurcio de Souza. Todas as informaes que desejamos esto na tabela
LISTA_DE_HOSPEDES, que tem a seguinte aparncia:
SELECT * FROM LISTA_DE_HOSPEDES;

NOME QUARTO TCNICO CHEGADA SADA DESCTO


JANE FYUNDAI 3 JLIO 15-08-1997 17-08-1997 0.20
MARCELO FREITAS 2 BRUNA 26-08-1997 0.10
JANE FYUNDAI 4 SERENA 24-08-1997
ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997
JOS AUGUSTO 7 JLIO 15-08-1997 19-08-1997
MAURCIO DE SOUZA 5 RICARDO 25-08-1997 0.15
BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05
STELLA SHIELDS 8 SERENA 25-08-1997 0.15
ALEXANDRE GOMES 9 BRUNA 17-08-1997 23-08-1997 0.20
Poderamos, evidentemente, usar uma query para selecionar DESCONTO onde NOME fosse igual a
MAURICIO DE SOUZA e, em seguida, uma outra que selecionasse NOME e DESCONTO onde
DESCONTO fosse igual ao resultado da primeira query. Mais digamos que quisssemos optar por uma
forma mais elegante e menos trabalhosa usar uma nica query.
Esta tarefa parece bastante simples. Poderamos comear a construir a query assim:

SELECT NOME, DESCONTO


FROM LISTA_DE_HOSPEDES
WHERE DESCONTO = ...?

Entretanto, neste ponto chegamos a um impasse. Queremos dizer WHERE DESCONTO = (o desconto de
Maurcio de Souza), mas no vemos como.
Observe como seria fcil resolver este problema se, ao invs de lida com apenas uma tabela, estivssemos
lidando com duas, a fim de obter o desconto de Maurcio de Souza de uma e as informaes sobre os
outros hspedes da outra. Ento, usando as letras A e B para distinguir duas tabelas na realidade idnticas,
teramos a seguinte query:

SELECT A.NOME, A.DESCONTO


FROM LISTA_DE_HOSPEDES A, LISTA_DE_HOSPEDES_B
WHERE A.DESCONTO = B.DESCONTO
AND B.NOME = MAURICIO DE SOUZA;

NOME DESCTO
MAURCIO DE SOUZA 0.15
STELLA SHIELDS 0.15
Como voc pode comprovar atravs do resultado, esta a forma que temos para resolver este tipo de query
chamada auto-juno.
Os nomes de tabelas temporrios, denominados nomes correlatos ou ttulos (labels), so os elementos-
chaves que permitem que a juno ocorra a partir de uma nica tabela. Os nomes correlatos so definidos
na lista do FROM, na qual estabelecemos que a tabela em questo passa a ser conhecida por estes nomes. A
partir da, todos os nomes de colunas que quisermos usar tero como prefixo estes nomes correlatos.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 22


SQL - Structure Query Language

6.4. Outros Tipos de Junes


Quando a condio de pesquisa utilizada no est baseada em uma relao de igualdade e sim de maior
que (>).
Eventualmente junes como esta, no baseadas em uma relao de igualdade, so conhecidas como no
equijunes. O termo engloba todas as junes que utilizem qualquer operador relacional exceto o de
igualdade ( = ).
Nem todas as implementaes SQL comportam este tipo de juno.

7.Queries em Outras Declaraes

7.1. Declarao UNION


A palavra-chave UNION vincula queries sucessivas e une os seus resultados. As linhas duplicadas so
suprimidas.
As queries vinculadas tm que ter o mesmo nmero de elementos na lista do SELECT, e os tipos de dados
e tamanho tm que coincidir coluna a coluna. Por exemplo, se a primeira coluna da lista do SELECT da
primeira query for do tipo VARCHAR(25), ento a primeira coluna da lista do SELECT de cada uma das
queries subseqentes na declarao UNION tem que ser tambm do tipo VARCHAR(25). No poderiam
ser colunas VARCHAR(8) e nem colunas numricas ou de data e hora. Se, por fim, uma das colunas for
definida como NOT NULL, todas as colunas a serem unidas a ela tero que ser tambm como NOT NULL.
O exemplo a seguir une os nomes dos hspedes da tabela HOSPEDES com os da tabela
LISTA_DE_HOSPEDES. Como as linhas duplicadas so eliminadas, o resultado ser exatamente o mesmo
que o da primeira query.
Ambas da colunas so do tipo VARCHAR.
SELECT NOME FROM HOSPEDES
UNION
SELECT NOME FROM LISTA_DE_HOSPEDES;

NOME
JOS AUGUSTO
MAURCIO DE SOUZA
BIANCA OLIVEIRA
JANE FYUNDAI
STELLA SHIELDS
ROGRIO NUNES
As declaraes SELECT em uma UNION podem conter funes e clusulas WHERE e GROUP BY, e
uma clusula ORDER BY tambm pode ser acrescentada UNION como um todo.
No h limites para o nmero de queries cujos os resultados podem ser unidos atravs de uma UNION.

7.2. Utilizando Queries para Incluir Dados


Abordemos agora o ltimo uso do SELECT embutido em outra declarao. Alm de servir para selecionar
dados para uma query externa, pode ser usado para incluir dados quando a declarao externa for um
INSERT.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 23


SQL - Structure Query Language

Suponhamos que quisssemos criar uma tabela HOSPEDES_HOMENS, idntica HOSPEDES, exceo
de que, ao invs de listar o sexo, o biotipo e a altura de todos os hspedes, antigos e atuais,
HOSPEDES_HOMENS contm apenas os dados dos hspedes do sexo masculino (e, portanto, no listar
o sexo). A tabela criada pela declarao abaixo:
CREATE TABLE HOSPEDES_HOMENS (NOME VARCHAR(25), BIOTIPO VARCHAR(1),
ALTURA INTEGER);

Agora temos que incluir dados. Os dados que desejamos j esto cadastrados na tabela HOSPEDES e
podem ser extrados e includos atravs de uma declarao INSERT contendo uma query.
INSERT INTO HOSPEDES_HOMENS
SELECT NOME, BIOTIPO, ALTURA
FROM HOSPEDES
WHERE SEXO = M;

As nicas restries existentes neste caso so as seguintes:


O nmero de colunas do SELECT tem que ser o mesmo que o da declarao INSERT ou, como nosso
exemplo, o mesmo nmero de colunas contidas na tabela, se as colunas no forem mencionadas.
O tipo e o tamanho dos dados selecionados tm que ser compatveis com as especificaes das colunas
na tabela de destino. Por exemplo, nmeros podem ser includos em uma coluna de tipo caractere, mas
o contrrio no aceito.

8.Alterando Tabelas e Dados


At agora lidamos a maior parte do tempo com as queries declaraes SELECT que nos permitem, de
uma forma ou de outra, obter dados de uma tabela. Nesta etapa da apostila, discutiremos exemplos de dois
outros tipos de declaraes SQL: declaraes de manipulao de dados, usadas para alterar os dados de
um banco de dados, e declaraes de definio de dados, que servem para fazer alteraes na estrutura do
banco de dados.

8.1. Alterando os Dados


Uma declarao de manipulao de dados que j vimos o INSERT, cuja funo incluir novas linhas.
Alm do INSERT, h mais duas outras declaraes de manipulao de dados: UPDATE e DELETE. Como
o INSERT as duas declaraes nos permitem alterar o contedo do banco de dados. UPDATE altera linhas
existentes e DELETE as exclui do banco de dados.

8.1.1. Atualizando Dados em uma Linha


Suponhamos que um dia Alexandre nos informasse que teria mudado seu nome para Andr e que gostaria
que trocssemos tambm em nossos registros o seu nome antigo pelo nome novo. Poderamos usar a
declarao UPDATE abaixo para fazer esta alterao na tabela LISTA_DE_HOSPEDES:
UPDATE LISTA_DE_HOSPEDES
SET NOME = ANDRE
WHERE NOME = ALEXANDRE;

O nome da tabela ou viso a ser atualizada indicado na primeira linha do exemplo. Na segunda linha
aparece o nome da coluna a ser atualizada e o tipo de alterao, e na terceira a condio de pesquisa. Como
nas queries, se no houver condies de pesquisa, a operao ser executada em todas as linhas.
Suponhamos que Andr tambm queira trocar o quarto 9, o qual teve que dividir com Jane Fyundai, pelo 7,
que espera poder ocupar sozinha; e digamos que tambm consiga obter mais 2% de desconto, alm dos 20
originais.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 24


SQL - Structure Query Language

Podemos usar a declarao UPDATE para realizar as duas alteraes de uma s vez. A segunda condio
de pesquisa, especificando a data de chegada, necessria pois existem dois quartos ocupados pelo Andr
em LISTA_DE_HOSPEDES, e s queremos alterar um deles.
UPDATE LISTA_DE_HOSPEDES
SET QUARTO = 7, DESCONTO = DESCONTO + 0.02
WHERE NOME = ALEXANDRE
AND CHEGADA = 17-08-97;

Como podemos observar no exemplo, possvel alterar mais de uma coluna ao mesmo tempo e usar
expresses aritmticas para indicar o valor novo.

8.1.2. Eliminando Linhas


Podemos remover linhas de uma tabela, desde que seja atualizvel, atravs da declarao DELETE. Da
mesma forma que com o UPDATE, qualquer linha que seja eliminada de uma viso ser tambm eliminada
da tabela original.
A declarao abaixo elimina da tabela LISTA_DE_HOSPEDES todas as linhas de hspedes que tenham
uma data de sada registrada:
DELETE FROM LISTA_DE_HOSPEDES
WHERE SAIDA IS NOT NULL;

Para eliminar todas as linhas de uma tabela, no especifique uma condio de pesquisa.

8.1.3. Gravando e Desfazendo Alteraes


Nos dois tpicos anteriores, fizemos vrias alteraes no banco de dados. Podemos desfaz-las atravs da
declarao:
ROLLBACK;

Com esta declarao recuperamos de volta as linhas que havamos excludo, e os dados alterados voltaram
a ser exatamente o que eram antes da alterao. Se tivssemos eliminado as tabelas por inteiro, elas tambm
seriam recuperadas.

8.2. Alterando uma Tabela


Alm de alterar os dados de uma tabela, a SQL nos permite tambm alterar a sua estrutura, atravs da
declarao ALTER TABLE. Uma outra declarao, DROP, que ser discutida no final deste tpico, serve
para eliminar a tabela completamente.
O nmero exato de caractersticas da tabela que podemos alterar varia em funo da implementao da
declarao ALTER TABLE. Ela possui vrias clusulas ou continuaes, correspondentes s operaes
que sero executadas, que variam de implementao para implementao. A SQL padro, assim como a
maioria das implementaes, limita as opes em duas, ADD e MODIFY. O SQL Base complementa este
padro com trs outras continuaes.
Suponhamos, por exemplo, que comessemos uma declarao ALTER TABLE da seguinte maneira:
ALTER TABLE LISTA_DE_HOSPEDES

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 25


SQL - Structure Query Language

Em SQL Base, temos cinco opes de clusulas ou continuaes para complementar a declarao,
dependendo da operao desejada:

ADD (incluir) uma nova coluna


MODIFY (modificar) o tamanho de uma coluna ou se a coluna
dever aceitar valores nulos.
DROP (eliminar) uma coluna existente
RENAME (trocar o nome de) uma coluna existente
RENAME TABLE (trocar nome tabela)
Comecemos pela primeira opo: eliminar uma coluna.

8.2.1. Eliminando uma Coluna


Suponhamos que decidssemos no dar mais descontos a nenhum hspede. Podemos eliminar a coluna
DESCONTO da LISTA_DE_HOSPEDES da seguinte forma:
ALTER TABLE LISTA_DE_HOSPEDES
DROP DESCONTO;
Poderamos, se desejado, eliminar mais de uma coluna da tabela em uma s declarao, separando os
nomes das colunas por vrgulas, da mesma forma que na lista do SELECT. Por exemplo:
ALTER TABLE LISTA_DE_HOSPEDES
DROP QUARTO, SAIDA;
Entretanto, no poderamos usar a declarao ALTER TABLE para alterar mais de uma tabela ao mesmo
tempo.
Uma coluna que possua um ndice no pode ser eliminada, a no ser que o ndice seja eliminado antes.

8.2.2. Incluindo uma Coluna


Usamos a clusula ADD da declarao ALTER TABLE para incluir uma coluna.
Incluir uma coluna mais trabalhoso do que apagar uma outra, pois temos que especificar o tipo de dado
que ir conter, o tamanho (quando necessrio) e se aceitar ou no valores nulos, exatamente da mesma
forma que procedemos quando definimos as colunas de uma tabela ao cri-la.
A declarao a seguir inclui uma nova coluna DESCONTO igual que eliminamos:

ALTER TABLE LISTA_DE_HOSPEDES


ADD DESCONTO DECIMAL(2,2);
Especificamos que a nova coluna do tipo DECIMAL e o seu tamanho (2,2). Como queramos que a
coluna aceitasse valores nulos, no mencionamos NOT NULL, mas poderamos t-lo feito.
A nova coluna DESCONTO est vazia, isto , s contm valores nulos, porque at agora no foram
includos dados nela. Mesmo que tivssemos especificado NOT NULL, a coluna conteria valores nulos
iniciais. NOT NULL apenas garante que no sero aceitos valores nulos em futuras atualizaes.
Como na excluso poderamos incluir mais de uma coluna de uma s vez. A declarao a seguir inclui as
colunas SAIDA e GARCOM:
ALTER TABLE LISTA_DE_HOSPEDES
ADD SAIDA DATE, GARCOM VARCHAR(10);

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 26


SQL - Structure Query Language

8.2.3. Modificando uma Coluna


A clusula MODIFY da declarao ALTER TABLE que nos permite aumentar o tamanho de uma coluna
de tamanho varivel. No entanto, no podemos reduzir o seu tamanho e alterar o seu tipo.
Por exemplo, podemos fazer com que uma coluna VARCHAR(5) passe a ser VARCHAR(10), mas no
que passe a ser do tipo INTEGER.
Podemos, ainda, fazer com que uma coluna que no aceite valores nulos passe a aceitar e tambm podemos
fazer o inverso, desde que a coluna no contenha nulos.
Por exemplo, no contm valores nulos na coluna TECNICO de LISTA_DE_HOSPEDES; ento
poderamos, se necessrio, fazer com que TECNICO passasse a ser NOT NULL. J no podemos fazer o
mesmo com a coluna DESCONTO, pois ela contm valores nulos.
A declarao abaixo altera o tamanho da coluna TECNICO de 8 para 25 e define a coluna como NOT
NULL:
ALTER TABLE LISTA_DE_HOSPEDES
MODIFY TECNICO VARCHAR(25) NOT NULL;
Podemos alterar mais de uma coluna ao mesmo tempo, separando-as por vrgulas na clusula MODIFY:
ALTER TABLE LISTA_DE_HOSPEDES
MODIFY TECNICO VARCHAR(30) NULL, NOME NULL;

8.2.4. Trocando o Nome de uma Tabela ou Coluna


As duas ltimas opes da declarao ALTER TABLE so RENAME, para trocar o nome de colunas,
RENAME TABLE de tabelas.
Os exemplos a seguir trocam o nome da coluna GARCOM para SERVENTE:
ALTER TABLE LISTA_DE_HOSPEDES
RENAME GARCOM SERVENTE;
No necessrio informar o tipo de dado ou o tamanho da coluna, porque estes mantm-se os mesmos.
RENAME TABLE funciona da mesma forma. A nica diferena que como o nome da tabela j esta
indicado na clusula ALTER TABLE, s temos que especificar o novo nome na clusula RENAME
TABLE.
A declarao abaixo altera o nome da tabela LISTA_DE_HOSPEDES para LISTA:
ALTER TABLE LISTA_DE_HOSPEDES
RENAME TABLE LISTA;

8.2.5. Eliminando uma Tabela


Para eliminar totalmente uma tabela, usamos a declarao DROP.
DROP se assemelha ao ALTER TABLE quanto ao fato de serem vrias declaraes em uma s.
Dependendo de como voc o formula, o DROP pode eliminar uma tabela, uma viso, um ndice ou um
sinnimo. Neste tpico, descrevemos apenas a eliminao de tabelas e vises. ndices e sinnimos sero
estudados mais adiante.
A declarao a seguir apaga a tabela QUARTOS:
DROP TABLE QUARTOS;
Quando uma tabela eliminada do banco de dados, todas as vises derivadas dela e ndices e sinnimos
definidos para ela, assim como os privilgios designados em funo dela, tambm desaparecem.
Se tentarmos executar uma query na tabela QUARTOS agora, receberemos uma mensagem de erro
indicando que a tabela no existe.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 27


SQL - Structure Query Language

9.Utilizando ndice para Melhorar a Performance


Observe que as linhas da tabela LISTA_DE_HOSPEDES esto listadas em uma ordem aleatria, ou seja,
em nenhuma das colunas os valores seguem a uma ordem alfabtica ou numrica. Ao invs disso,
aparecem na ordem em que foram includas.
Se quisermos procurar um determinado nome, teremos que percorrer toda a coluna NOME at encontr-lo.
O mecanismo de busca do sistema de banco de dados no difere em muito nosso mtodo. Ele tambm
percorreria os dados da coluna at localizar o nome desejado.
O uso de ndices acelera a procura. Quando criamos ndices para uma coluna, ela classificada de tal forma
que, sempre que for mencionada em uma query, o sistema usar o ndice para ter acesso direto aos dados
desejados, ao invs de vasculhar a coluna toda. Os ndices so ento muito teis s queries que se referem a
uma nica linha. Em termos gerais os ndices so teis em qualquer coluna que seja consultada
freqentemente.
Criamos um ndice com a declarao CREATE INDEX, e ele automaticamente atualizado quando a
coluna (ou colunas) a ele associada (s) sofre (m) alguma alterao.
Um ndice s deixa de existir se for executada a declarao DROP INDEX ou se a tabela para qual foi
criada foi eliminada.
Podemos criar um ndice para apenas uma coluna ou vrias em conjunto. A segunda forma de ndice
conhecida como concatenado ou composto. Podemos criar quantos ndices quisermos, no h limites. No
entanto, devemos considerar o fato de que ocupam bastante espao em disco e seria aconselhvel no criar
tantos ndices a ponto de confundir o otimizador do banco de dados.
O otimizador um subsistema do sistema de banco de dados que seleciona os caminhos de acesso e decide
qual a melhor maneira de extrair os dados solicitados por uma query. o otimizador que escolhe quais
ndices disponveis deve usar, se houver; o usurio no precisa se preocupar com isso.

9.1. Utilizando um ndice


A query abaixo pesquisa duas tabelas para obter o nome, o tcnico e a altura de todos os hspedes.
SELECT A.NOME, TECNICO, ALTURA
FROM LISTA_DE_HOSPEDES A, HOSPEDES B
WHERE A.NOME = B.NOME;
Usaremos a declarao CREATE INDEX para criar um ndice, especificando primeiro o nome da tabela,
LISTA_DE_HOSPEDES, e, em seguida, entre parnteses, a coluna ou as colunas a serem indexadas.
Podemos incluir tambm a palavra-chave ASC ou DESC ao lado do nome da coluna para identificar a
indexao em ordem crescente ou decrescente. O default a ordem crescente.
CREATE INDEX NOME_ID
ON LISTA_DE_HOSPEDES (NOME);

O ndice acelera a execuo da query anterior em 13% em um PC/AT.

9.2. Utilizando um ndice nico


A query que utilizamos envolve uma juno de duas tabelas. Podemos criar um ndice na segunda tabela
tambm.
No especificamos que NOME_ID deveria ser um ndice nico, pois a coluna
LISTA_DE_HOSPEDES.NOME contm nomes repetidos. Existem hspedes que j fizeram duas visitas
no Spa. Um ndice nico no pode ser criado em uma coluna ou grupo de colunas que contenha linhas
duplicadas.
A tabela HOSPEDES, porm, representa o nosso arquivo contendo todos os hspedes passados e atuais, no
qual cada hspede s aparece uma vez. Alm disso, queremos nos certificar de que a coluna NOME da
tabela HOSPEDES s contm o nome de cada hspede uma nica vez, para que possamos tornar o nosso
ndice nico.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 28


SQL - Structure Query Language

A declarao abaixo cria um ndice nico na coluna NOME da tabela HOSPEDES:


CREATE UNIQUE INDEX NOME1_IND
ON HOSPEDES (NOME);
Chamamos este ndice de NOME1_IND porque j temos o NOME_IND, e os ndices tm que ter nomes
diferentes, mesmo que sejam criados em colunas de tabelas diferentes.
Devido a presena de um ndice nico, qualquer valor duplicado no ser aceito. Agora com os dois ndices
que criamos, a query do incio deste tpico tem a sua execuo acelerada em 20% em um PC/AT.

9.3. Utilizando um ndice Concatenado


Para exemplificar o nosso prximo exemplo criaremos uma nova tabela chamada QUADRO_DE_PESOS,
a qual fornece os pesos mnimo e mximo aceitveis para homens e mulheres de acordo com o biotipo, e a
altura em metros. A declarao para cri-la a seguinte:
CREATE TABLE QUADRO_DE_PESOS (ALTURA DECIMAL(3,2), SEXO CHAR(1),
BIOTIPO CHAR(1), PS_MIN DECIMAL(3,1), PS_MAX DECIMAL (3,1));
Com os dados includos separadamente, a tabela tem o seguinte aspecto:
SELECT * FROM QUADRO_DE_PESOS;

ALTURA SEXO BIOTIPO PS_MIN PS_MAX


1,67 M M 56 58.5
1,72 M M 57 59.5
1,65 F G 57.5 60
1,80 F G 72 78.5
1,65 F M 73.5 80
1,78 M M 75 82.5
1,85 M M 60 66

Sempre que quisermos consultar a faixa aceitvel de peso de uma pessoa na tabela QUADRO_DE_PESOS,
teremos que fornecer ao sistema os valores das trs colunas ALTURA, SEXO e BIOTIPO.
A query a seguir executa esta consulta. Seleciona o nome, o tcnico e a faixa aceitvel de peso de todos os
hspedes. NOME e TECNICO vm da LISTA_DE_HOSPEDES; a altura, o sexo e o biotipo so obtidos
da tabela HOSPEDES e so usados para localizar a respectiva faixa no QUADRO_DE_PESOS:
SELECT A.NOME, TECNICO, PS_MIN, PS_MAX
FROM LISTA_DE_HOSPEDES A, HOSPEDES B, QUADRO_DE_PESOS C
WHERE A.NOME = B.NOME
AND B.SEXO = C.SEXO
AND B.ALTURA = C.ALTURA
AND B.BIOTIPO = C.BIOTIPO;
Podemos reduzir significamente o tempo de execuo da query criando um ndice concatenado abrangendo
as colunas ALTURA, SEXO e BIOTIPO:
CREATE INDEX PESO_IND
ON QUADRO_DE_PESOS (ALTURA, SEXO, BIOTIPO);
O ndice concatenado reduz o tempo de execuo da query em 38% em um PC/AT.

9.4. Apagando um ndice


Qualquer ndice de uma tabela eliminado automaticamente quando a tabela excluda. Para eliminar um
ndice manualmente, usamos a declarao DROP INDEX, que a mesma declarao usada para apagar
tabelas. S agora concluiremos a explicao desta declarao.
A declarao abaixo apaga o ndice PESO_IND que criamos na tabela QUADRO_DE_PESOS:
DROP INDEX PESO_IND;
A tabela onde foi criado o ndice no afetada pela sua eliminao.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 29


SQL - Structure Query Language

10.Programando em SQL
No incio desta apostila, vimos como usar a linguagem SQL de modo interativo, ou seja, como executar as
declaraes SQL diretamente do teclado. Agora, focalizaremos o tpico programao em SQL
declaraes SQL embutidas em programas escritos em outra linguagem, como por exemplo, C ou COBOL.

10.1. Porque SQL Embutida


Como foi mencionado na introduo, SQL no uma linguagem de programao e nem uma linguagem
interativa. No podemos escrever programas em SQL diretamente. Temos que execut-las atravs de um
programa que converse com o sistema de banco de dados e realize as operaes que a SQL no foi
projetada para realizar.

10.2. Utilizando a Ferramenta ACCESS


Para que possamos entender melhor a SQL, utilizaremos um Sistema de Gerenciamento de Banco de
Dados bem conhecido o Microsoft Access. A ferramenta Access permite-nos utilizar comandos SQL para
manipulao de dados, portanto poderemos utilizar os comandos aprendidos at agora.
O Microsoft Access possui um arquivo de exemplo de banco de dados chamado NorthWind, o qual iremos
utilizado para manipulao de dados.
Ao iniciar o Access aparecer a seguinte tela:

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 30


SQL - Structure Query Language

Clique na opo "Abrir banco de dados existentes", selecione o arquivo Northwind e clique em "OK".
Caso o arquivo no esteja na relacionado na lista de arquivos, selecione a opo "Mais arquivos..." e em
seguida o boto OK. O arquivo encontra-se na seguinte pasta "C:\Arquivos de Programas\Microsoft
Office\Exemplos".
Aps o arquivo aberto aparecer a seguinte tela:

Esta janela possui toda estrutura do arquivo Nortwind, esta estrutura dividida pelas seguintes guias:
Tabela / Consulta / Formulrio / Relatrios / Macros / Mdulos, a guia tabela possui todas as tabelas do
Northwind, que utilizaremos nos nossos exerccios.
Clique na guia Consulta, exclua todas as consultas existentes nesta caixa ( Shift+Delete).
A caixa dever ficar com a seguinte aparncia:

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 31


SQL - Structure Query Language

Clique no boto NOVO, em seguida na aparecer a seguinte tela:

Selecione a opo Modo estrutura e clique no boto OK.


Em seguida clique no boto Cancelar na prxima Caixa de Dilogo.
Pronto! Voc dever esta com a janela de consulta aberta. (observe a figura abaixo)

Antes de iniciarmos os nossos exerccios, precisaremos alterar para a janela MODO SQL.
Siga as seguintes instrues:
Clique no Menu Exibir, opo Modo SQL.

Esta janela ser utilizada para criarmos nossas consultas atravs da SQL. Para executar cada consulta
clique no boto "Executar" na barra de ferramentas.
Obs1.: Para cada consulta criada utilizaremos um arquivo, ou seja, gravaremos a consulta atual e
abriremos uma nova.
Obs2.: Caso necessrio consulte os anexos de tabelas para resoluo dos exerccios.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 32

Você também pode gostar