You are on page 1of 33

T301B

SQL
Structure Query Language Luis Fernando Calbria Erick Franklin Leonardo Bandeira

SQL - Structure Query Language


ESCOLA TCNICA DE INFORMTICA

Sumrio
1. INTRODUO 1.1. 1.2. 1.3. 1.4. 1.5. 2. 2.1. 2.2. 2.3. SOBRE SQL VISO GERAL DE UM BANCO DE DADOS RELACIONAL COLUNAS E LINHAS ENTIDADES E CHAVE PRIMRIA CHAVE PRIMRIA COMPOSTA CRIANDO UMA TABELA IDENTIFICADORES E ATRIBUTOS TIPOS DE DADOS 2.3.1. DADOS CARACTERES STRINGS 2.3.2. DADOS NUMRICOS 2.3.3. DADOS DATA E HORA INCLUINDO DADOS CLUSULAS SELECT E FROM CLUSULA WHERE 3.2.1. PREDICADOS RELACIONAIS 3.2.2. OUTROS PREDICADOS RELACIONAIS 3.2.3. VINCULANDO VRIOS PREDICADOS: AND E OR OPERADORES ARITMTICOS FUNES 4.2.1. FUNES AGREGADAS 4.2.2. FUNES NO AGREGADAS 4.2.3. FUNES DE SEQNCIAS DE CARACTERES 4.2.4. FUNES DE DATA E HORA CLUSULA GROUP BY CLUSULA HAVING CLUSULA ORDER BY EQUIJUNES JUNES EXTERNAS AUTO-JUNES OUTROS TIPOS DE JUNES DECLARAO UNION UTILIZANDO QUERIES PARA INCLUIR DADOS 3 3 3 4 4 5 6 6 7 7 7 7 8 8 9 9 10 11 11 13 14 14 15 15 15 16 16 17 17 17 18 19 20 21 21 23 23 23 23

A LINGUAGEM SQL

2.4. 3. 3.1. 3.2.

QUERIES: OBTENDO OS DADOS DESEJADOS

4.

QUERIES: MANIPULANDO DADOS 4.1. 4.2.

5.

ORGANIZANDO O RESULTADO 5.1. 5.2. 5.3.

6.

JUNES: QUERIES QUE ENVOLVEM MAIS DE UMA TABELA 6.1. 6.2. 6.3. 6.4.

7.

QUERIES EM OUTRAS DECLARAES 7.1. 7.2.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira

Pgina 1

SQL - Structure Query Language


ESCOLA TCNICA DE INFORMTICA

8.

ALTERANDO TABELAS E DADOS 8.1. ALTERANDO OS DADOS 8.1.1. ATUALIZANDO DADOS EM UMA LINHA 8.1.2. ELIMINANDO LINHAS 8.1.3. GRAVANDO E DESFAZENDO ALTERAES ALTERANDO UMA TABELA 8.2.1. ELIMINANDO UMA COLUNA 8.2.2. INCLUINDO UMA COLUNA 8.2.3. MODIFICANDO UMA COLUNA 8.2.4. TROCANDO O NOME DE UMA TABELA OU COLUNA 8.2.5. ELIMINANDO UMA TABELA UTILIZANDO UM NDICE UTILIZANDO UM NDICE NICO UTILIZANDO UM NDICE CONCATENADO APAGANDO UM NDICE PORQUE SQL EMBUTIDA UTILIZANDO A FERRAMENTA ACCESS

24 24 24 25 25 25 26 26 27 27 27 28 28 28 29 29 30 30 30

8.2.

9.

UTILIZANDO NDICE PARA MELHORAR A PERFORMANCE 9.1. 9.2. 9.3. 9.4.

10.

PROGRAMANDO EM SQL 10.1. 10.2.

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira

Pgina 2

SQL - Structure Query Language


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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 JOS AUGUSTO MAURCIO DE SOUZA BIANCA OLIVEIRA JANE FYUNDAI STELLA SHIELDS ROGRIO NUNES

SEXO M M F F F M

BIOTIPO M M G G M M

ALTURA 1,67 1,72 1,65 1,80 1,65 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


ESCOLA TCNICA DE INFORMTICA

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 JANE FYUNDAI MARCELO FREITAS ALEXANDRE GOMES JOS AUGUSTO MAURCIO DE SOUZA BIANCA OLIVEIRA JANE FYUNDAI STELLA SHIELDS ALEXANDRE GOMES

QUARTO 4 2 1 3 5 6 7 8 9

TCNICO JLIO BRUNA RICARDO JLIO RICARDO BRUNA SERENA SERENA BRUNA

CHEGADA 15-08-1997 26-08-1997 14-08-1997 15-08-1997 25-08-1997 15-08-1997 24-08-1997 25-08-1997 17-08-1997

SADA 17-08-1997 16-08-1997 19-08-1997 20-08-1997

DESCTO 0.20 0.10

0.15 0.05 0.15 0.20

23-08-1997

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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 Organizaes de Padres Intern. Padro IBM EUA (USA) Padro IBM Europa (EUR) Padro Industrial Japons (JIS)

Formato aaaa-mm-dd mm/dd/aaaa dd.mm.aaaa aaaa-mm-dd

Exemplo 1998-10-30 10/30/1998 30.10.1998 1998-10-30

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


Tabela Formatos de Horas

Nome Organizaes de Padres Intern. Padro IBM EUA (USA) Padro IBM Europa (EUR) Padro Industrial Japons (JIS)

Formato hh.mm.ss hh:mm AM ou PM hh.mm.ss hh:mm:ss

Exemplo 14.30.02 2:30 PM 14.30.02 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


ESCOLA TCNICA DE INFORMTICA

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

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


ESCOLA TCNICA DE INFORMTICA

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 MARCELO FREITAS BIANCA OLIVEIRA ALEXANDRE GOMES TCNICO BRUNA BRUNA 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


ESCOLA TCNICA DE INFORMTICA

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 no igual a no igual a > !> < maior que no maior que menor que !< >= <= no menor que maior ou igual a 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 JANE FYUNDAI MARCELO FREITAS MAURCIO DE SOUZA STELLA SHIELDS ALEXANDRE GOMES DESCTO 0.20 0.10 0.15 0.15 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


ESCOLA TCNICA DE INFORMTICA

SELECT NOME, SAIDA FROM LISTA_DE_HOSPEDES WHERE SAIDA BETWEEN 19-08-1997 AND 24-08-1997; NOME JOSE AUGUSTO BIANCA OLIVEIRA ALEXANDRE GOMES SAIDA 19-08-1997 20-08-1997 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 MARCELO FREITAS JANE FYUNDAI STELLA SHIELDS SAIDA

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) * (asterisco) Vale por qualquer caractere nico 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


ESCOLA TCNICA DE INFORMTICA

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 JANE FYUNDAI MARCELO FREITAS JOS AUGUSTO BIANCA OLIVEIRA ALEXANDRE GOMES TCNICO JLIO BRUNA JLIO BRUNA BRUNA QUARTO 3 2 4 6 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 ALEXANDRE GOMES MAURCIO DE SOUZA JANE FYUNDAI STELLA SHIELDS QUARTO 1 5 7 8 TCNICO RICARDO RICARDO SERENA 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 JANE FYUNDAI STELLA SHIELDS TCNICO DESCTO SERENA SERENA 0.15

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira

Pgina 13

SQL - Structure Query Language


ESCOLA TCNICA DE INFORMTICA

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 MARCELO FREITAS DESCTO 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


ESCOLA TCNICA DE INFORMTICA

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) MAX(argumento) MIN(argumento) SUM(argumento) COUNT(argumento) Retorna a mdia dos valores do argumento Retorna o maior valor do argumento Retorna o menor valor do argumento Retorna o somatrio dos valores do 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) 0.115635 MAX(DESCONTO) 0.20 MIN(DESCONTO) 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


ESCOLA TCNICA DE INFORMTICA

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 JANE FYUNDAI MARCELO FREITAS JOS AUGUSTO BIANCA OLIVEIRA ALEXANDRE GOMES @LENGTH (NOME) 12 15 12 15 15

SELECT NOME, @PROPER(@LENGTH(NOME,5)) FROM LISTA_DE_HOSPEDES; NOME JANE FYUNDAI MARCELO FREITAS JOS AUGUSTO BIANCA OLIVEIRA ALEXANDRE GOMES @PROPER(@LENGTH (NOME,5)) jane marce jos bianc 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 JANE FYUNDAI MARCELO FREITAS ALEXANDRE GOMES JOS AUGUSTO CHEGADA 15-08-1997 26-08-1997 14-08-1997 15-08-1997 @DAY(CHEGADA) 15 26 14 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


ESCOLA TCNICA DE INFORMTICA

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 BRUNA BRUNA BRUNA JLIO JLIO RICARDO RICARDO SERENA SERENA NOME MARCELO FREITAS BIANCA OLIVEIRA ALEXANDRE GOMES JANE FYUNDAI JOS AUGUSTO ALEXANDRE GOMES MAURCIO DE SOUZA JANE FYUNDAI 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


ESCOLA TCNICA DE INFORMTICA

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 JANE FYUNDAI MARCELO FREITAS ALEXANDRE GOMES JOS AUGUSTO MAURCIO DE SOUZA JANE FYUNDAI MARCELO FREITAS ALEXANDRE GOMES JOS AUGUSTO MAURCIO DE SOUZA PESO 68 59 86 87 68.5 67.5 55 84 84 67 QUANDO 14-08-97 14-08-97 15-08-97 15-08-97 15-08-97 16-08-97 16-08-97 17-08-97 17-08-97 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 MARCELO FREITAS ALEXANDRE GOMES JOS AUGUSTO MAURCIO DE SOUZA MIN(PESO) 55 84 84 67 MAX(PESO MAX(PESO)-MIN(PESO) ) 59 4 86 2 87 3 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


ESCOLA TCNICA DE INFORMTICA

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 palavrachave 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 JOS AUGUSTO MAURCIO DE SOUZA BIANCA OLIVEIRA JANE FYUNDAI STELLA SHIELDS ROGRIO NUNES SEXO M M F F F M BIOTIPO M M G G M M ALTURA 1,67 1,72 1,65 1,80 1,65 1,78

A query a seguir obtm a altura de Rogrio Nunes : SELECT NOME, ALTURA FROM HOSPEDES WHERE NOME = BIANCA OLIVEIRA; NOME BIANCA OLIVEIRA ALTURA 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 BIANCA OLIVEIRA TECNICO 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


ESCOLA TCNICA DE INFORMTICA

FROM HOSPEDES, LISTA_DE_HOSPEDES WHERE HOSPEDES.NOME = LISTA_DE_HOSPEDES.NOME; NOME JANE FYUNDAI JOS AUGUSTO MAURCIO DE SOUZA BIANCA OLIVEIRA STELLA SHIELDS TCNICO ALTURA JLIO 1,80 JLIO 1,67 RICARDO 1,72 BRUNA 1,65 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 1 2 3 4 5 NOME ANA PAULA CARMEM SOUZA CRISTIANO BEZERRA MARCONE ALMEIDA MARIA FERREIRA TAXA 300 300 250 325 250

Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira

Pgina 20

SQL - Structure Query Language


ESCOLA TCNICA DE INFORMTICA

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 NOME JANE FYUNDAI MARCONE ALMEIDA QUARTOS.TAXA 325 LISTA_DE_HOSPEDES. DESCTO 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 JOS AUGUSTO MAURCIO DE SOUZA BIANCA OLIVEIRA JANE FYUNDAI STELLA SHIELDS ROGRIO NUNES CLINT WESTWOOD SEXO M M F F F M M BIOTIPO M M G G M M M ALTURA 1,67 1,72 1,65 1,80 1,65 1,78 1,85 TECNICO JULIO RICARDO BRUNA JULIO SERENA SERENA 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


ESCOLA TCNICA DE INFORMTICA

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

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 MAURCIO DE SOUZA STELLA SHIELDS DESCTO 0.15 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 elementoschaves 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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

Em SQL Base, temos cinco opes de clusulas ou continuaes para complementar a declarao, dependendo da operao desejada: ADD (incluir) MODIFY (modificar) DROP (eliminar) RENAME (trocar o nome de) RENAME TABLE (trocar nome tabela) uma nova coluna o tamanho de uma coluna ou se a coluna dever aceitar valores nulos. uma coluna existente uma coluna existente

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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 1,67 1,72 1,65 1,80 1,65 1,78 1,85 SEXO M M F F F M M BIOTIPO M M G G M M M PS_MIN 56 57 57.5 72 73.5 75 60 PS_MAX 58.5 59.5 60 78.5 80 82.5 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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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


ESCOLA TCNICA DE INFORMTICA

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