ti - linguagem sql ansi - concursos

Upload: anderson-marques-neto

Post on 07-Apr-2018

252 views

Category:

Documents


1 download

TRANSCRIPT

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    1/33

    S Q LStructure Query Language

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    2/33

    SQL - Structure Query Language

    Sumrio

    1. INTRODUO 3

    1.1. SOBRE SQL 31.2. VISO GERAL DE UM BANCO DE DADOS RELACIONAL 31.3. COLUNAS E LINHAS 41.4. ENTIDADES E CHAVE PRIMRIA 41.5. CHAVE PRIMRIA COMPOSTA 5

    2. A LINGUAGEM SQL 6

    2.1. CRIANDO UMA TABELA 6

    2.2. IDENTIFICADORES E ATRIBUTOS 72.3. TIPOS DE DADOS 7

    2.3.1. DADOS CARACTERES STRINGS 72.3.2. DADOSNUMRICOS 72.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 93.2. CLUSULA WHERE 10

    3.2.1. PREDICADOS RELACIONAIS 113.2.2. OUTROS PREDICADOS RELACIONAIS 113.2.3. VINCULANDO VRIOS PREDICADOS: AND E OR 13

    4. QUERIES: MANIPULANDO DADOS 14

    4.1. OPERADORES ARITMTICOS 144.2. FUNES 15

    4.2.1. FUNES AGREGADAS 154.2.2. FUNESNO AGREGADAS 154.2.3. FUNES DE SEQNCIAS DE CARACTERES 164.2.4. FUNES DE DATA E HORA 16

    5. ORGANIZANDO O RESULTADO 17

    5.1. CLUSULA GROUP BY 175.2. CLUSULA HAVING 175.3. CLUSULA ORDER BY 18

    6. JUNES: QUERIES QUE ENVOLVEM MAIS DE UMA TABELA 19

    6.1. EQUIJUNES 206.2. JUNES EXTERNAS 216.3. AUTO-JUNES 216.4. OUTROS TIPOS DE JUNES 23

    7. QUERIES EM OUTRAS DECLARAES 23

    7.1. DECLARAO UNION 23

    7.2. UTILIZANDO QUERIES PARA INCLUIRDADOS 23

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 1

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    3/33

    SQL - Structure Query Language

    8. ALTERANDO TABELAS E DADOS 24

    8.1. ALTERANDO OS DADOS 248.1.1. ATUALIZANDO DADOS EM UMA LINHA 24

    8.1.2. ELIMINANDO LINHAS 258.1.3. GRAVANDO E DESFAZENDO ALTERAES 258.2. ALTERANDO UMA TABELA 25

    8.2.1. ELIMINANDO UMA COLUNA 268.2.2. INCLUINDO UMA COLUNA 268.2.3. MODIFICANDO UMA COLUNA 278.2.4. TROCANDO ONOME DE UMA TABELA OU COLUNA 278.2.5. ELIMINANDO UMA TABELA 27

    9. UTILIZANDO NDICE PARA MELHORAR A PERFORMANCE 28

    9.1. UTILIZANDO UM NDICE 289.2. UTILIZANDO UM NDICE NICO 28

    9.3. UTILIZANDO UM NDICE CONCATENADO 299.4. APAGANDO UM NDICE 29

    10. PROGRAMANDO EM SQL 30

    10.1. PORQUE SQL EMBUTIDA 3010.2. UTILIZANDO A FERRAMENTA ACCESS 30

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 2

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    4/33

    SQL - Structure Query Language

    1.Introduo

    1.1. Sobre SQLUm banco de dados como um arquivo eletrnico, ou seja, tem a mesma funo que qualquer outroarquivo armazenar registros. A nica diferena que no banco de dados os registros so armazenadoseletronicamente.

    Para termos acesso aos registros armazenados ou mesmo cadastrar novos registros, precisamos de umsistema que gerencie o banco de dados. Este sistema gerenciador de banco de dados que torna possveisas 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), representandodiversas abordagens relativas s tarefas de acesso s informaes contidas no banco de dados, preservaoda 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 sejavisvel o predomnio da abordagem relacional nos novos sistemas do mercado.

    Em um sistema relacional, os dados so armazenados e representados exclusivamente em tabelas. Emnenhum momento faz-se necessrio recorrer a outras estruturas, como rvores hierrquicas, para ter acessoaos 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 dedeclaraes, 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 peloInstituto de Padres Nacionais Americanos (ANSI), todas as implementaes particulares da SQLpersonalizam a linguagem de vrias formas. Tais implementaes complementam a linguagem padro comnovos tipos de declaraes ou expresses e muitas vezes adaptam as declaraes padronizadas snecessidades especficas.

    1.2. Viso Geral de um Banco de Dados Relacional

    Sistemas relacionais caracterizam um grande avano no armazenamento e no gerenciamento de grandesquantidades de dados. A principal razo para isso que, em um sistema relacional, pode-se reduzir bastanteo armazenamento de dados redundantes. Na verdade, idealmente falando, em um sistema projetadosegundo os princpios tericos da abordagem relacional, a redundncia no deve existir. Nenhumrelacionamento entre dois itens de dados (uma pessoa possui um endereo, por exemplo) deve aparecermais 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 queapenas 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 novosrelacionamentos; no ficam presos aos relacionamentos em que foram armazenados. Em segundo lugar, aatualizao torna-se muito mais fcil, pois poucos itens de dados tm que ser atualizados, o que reduz aincidncia de erros.

    Todos os dados de um sistema relacional so armazenados e exibidos em tabelas. Programas de planilhas esistemas de banco de dados no relacionais tambm usam tabelas, portanto no uma caractersticaexclusiva dos sistemas relacionais. Mas h algo que distingue a forma como os sistemas relacionais usamtabelas. Esta distino deriva-se da definio e da utilizao do banco de dados segundo certos princpiostericos da abordagem relacional. Mais adiante iremos abordar tais princpios.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 3

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    5/33

    SQL - Structure Query Language

    1.3. Colunas e Linhas

    Qualquer informao refere-se a qualquer coisa, e talvez o primeiro princpio da abordagem relacional sejao de todas as informaes contidas em uma tabela devem estar sempre relacionadas a exemplos de umtipo 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 tratamentoda forma fsica, selecionado, conceituado e imaginrio chamado Visual Spa (fig. 1.1).

    Fig. 1.1 - HOSPEDES

    NOME SEXO BIOTIPO ALTURAJOS AUGUSTO M M 1,67MAURCIO DE SOUZA M M 1,72BIANCA OLIVEIRA F G 1,65JANE FYUNDAI F G 1,80STELLA SHIELDS F M 1,65ROGRIO 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 umacaracterstica ou atributo dos hspedes. Os atributos em que estamos interessados so nome, sexo, biotipo ealtura 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 aque se refere a tabela.

    Cada linha horizontal da tabela HOSPEDE contm as informaes sobre todos os atributos referentes a umdeterminado hspede. Portanto, enquanto a coluna NOME exibe os nomes de todos os hspedes da tabela ea coluna SEXO o sexo de todos os hspedes e assim por diante em relao s outras colunas, a linha emque aparece o nome Jos Augusto contm informaes apenas referentes aos atributos do hspede chamadoJos 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, eassim por diante. Pelas mesmas razes, voc ter que ter os hspedes tambm individualizados no banco dedados. 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 darcondies para designar os quartos adequadamente, elaborar os programas de emagrecimento segundo asnecessidades 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 queter uma caracterstica que a identifique. Em um sistema relacional, esta caracterstica identificadora nopode 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 localizardentre os dados da linha aquele que poder identific-la univocamente.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 4

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    6/33

    SQL - Structure Query Language

    Em outras palavras, temos que procurar por uma coluna (ou grupo de colunas) que apresente um contedodiferente em cada linha dados que so duplicados em duas linhas. Esta caracterstica ento servir paraidentificar 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 igualmentesuficientes para identificar as linhas. Por exemplo, no basta saber apenas o sexo de um hspede que vocqueira identificar se este atributo compartilhado por metade dos seus hspedes. Da mesma forma, sesoubermos o biotipo de um hspede teremos um grupo mais reduzido mas no conseguiremos localizar umhspede em particular.

    O problema que as colunas SEXO e BIOTIPO contm valores duplicados. Quando duas linhas contm omesmo 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 contmvalores duplicados, as informaes nela contidas so por si s suficientes para distinguir a linha de umhspede na tabela.

    Descrevemos, na realidade, uma diferena entre os dois tipos de colunas. O primeiro tipo est baseado emum atributo que identifique univocamente ou defina uma linha. O segundo tipo baseia-se em atributosdescritivos 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 ouChave Primria. A chave de uma tabela lhe permite identificar as linhas individualmente, definindotambm as entidades s quais a tabela se refere. Um banco de dados relacional todas as tabelas tem que teruma 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 dasoutras 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 cadahspede e por ltimo o desconto se houver.

    Fig. 1.2 LISTA DE HSPEDES

    NOME QUARTO TCNICO CHEGADA SADA DESCTOJANE FYUNDAI 4 JLIO 15-08-1997 17-08-1997 0.20MARCELO FREITAS 2 BRUNA 26-08-1997 0.10ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997JOS AUGUSTO 3 JLIO 15-08-1997 19-08-1997MAURCIO DE SOUZA 5 RICARDO 25-08-1997 0.15BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05JANE FYUNDAI 7 SERENA 24-08-1997STELLA SHIELDS 8 SERENA 25-08-1997 0.15ALEXANDRE 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 valoresduplicados, inclusive NOME: Alexandre Gomes e Jane Fyundai estiveram hospedados duas vezes e porisso aparecem duas vezes na lista. Para estabelecermos uma chave para esta tabela, teremos que usar duasou mais colunas conjuntamente. Este tipo de chave, envolvendo duas ou mais colunas, denomina-se chavecomposta ou chave primria composta.

    No exemplo (Fig. 1.2) as colunas que melhor se candidatam a formar chave composta so NOME eCHEGADA. O NOME e a CHEGADA combinados lhe permite distinguir uma linha da outra, ou seja, noh linhas com os valores de NOME e CHEGADA iguais.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 5

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    7/33

    SQL - Structure Query Language

    2.A Linguagem SQLSQL uma linguagem prpria para a realizao de operaes relacionais. Em linhas gerais, umalinguagem 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 outrasmodificaes so efetuadas na estrutura de um banco de dados. As declaraes em SQL podem sersubdivididas 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 tabelasque j vimos anteriormente HSPEDES e LISTA DE HSPEDES. A tabela HSPEDES contm osdados de todos os hspedes do Visual Spa, passados e atuais. A tabela LISTA DE HSPEDES registra asdatas de entrada e sada, quartos ocupados, etc., de todas as pessoas que se hospedaram no spa no perodode 01 e 27/08/1997.

    Observe que as declaraes a seguir apenas criam as tabelas. Preench-las com dados constitui uma outraoperao, 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, QUARTOVARCHAR(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 HOSPEDESconsiste das quatro colunas NOME, SEXO, BIOTIPO e ALTURA; a LISTA_DE_HOSPEDES consistedas seis colunas NOME, QUARTO, TECNICO, CHEGADA, SAIDA e DESCONTO.

    Observe que ambas das declaraes CREATE TABLE terminam com um ponto e vrgula (;). Este o sinalde que a declarao terminou. Embora esta no seja propriamente uma caracterstica da SQL, todas asimplementaes 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 ecolocar um ponto e vrgula seguido de um retorno no final da ltima linha da declarao; asegunda e colocar na linha seguinte ltima linha da declarao uma barra (/) e um retorno como mostramos nos exemplos abaixo:SELECT NOME, ALTURAFROM HOSPEDES;

    ou

    SELECT NOME, ALTURAFROM 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 adeclarao toda em uma linha s, o que ocuparia menos espao. O ponto e vrgula ou a barra obrigatriosomente no final da ltima linha da declarao.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 6

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    8/33

    SQL - Structure Query Language

    2.2. Identificadores e Atributos

    Observe os dois traos sublinhados ( ___ ) ligando as trs palavras que compes o nome da tabelaLISTA_DE_HOSPEDES. O trao sublinhado um meio convencional para representar o espao nosnomes 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 comopartes 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 dedados numricos , e oferece vrios tipos particulares com diferentes caractersticas para atender snecessidades de cada coluna. Estes incluem CHAR (ou CHARACTER), para seqncias de caracteres, e ostipos NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION, paradados 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 dedados, inclusive dados binrios. Em SQL Base, os dados do tipo LONG podem ter um tamanho virtualqualquer (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, caracteresespeciais ou dgitos, e cujo tamanho no pode ultrapassar 254 bytes. O tamanho mximo (at 255caracteres) a ser aceito em uma coluna deve ser definido quando, ao cri-la, especificamos o atributo detamanho. 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 ouVARCHAR.

    2.3.2. Dados Numricos

    O tipo NUMBER armazena nmeros de 1.0E-100 a 1.0E+100, com, no mximo, 22 dgitos decimais depreciso. 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 depreciso, mas, ao contrrio do tipo NUMBER, as colunas DECIMAL tm que ter indicaes de preciso eescala em suas definies.

    O tipo INTEGER armazena um nmero com at dez dgitos de preciso. No so aceitos dgitosfracionrios; 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 tipoINTEGER, 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    9/33

    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 sercodificados 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 ehora.

    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/1998Padro 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 eLISTA_DE_HOSPEDES, sem preench-las com dados. Para incluir dados nas tabelas, usamos uma outradeclarao 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 umaquery que recupere de outra tabela os dados a serem includos.

    A declarao SQL abaixo ilustra a incluso de uma nica linha de dados na tabelaLISTA_DE_HOSPEDES. A linha consiste de seis itens de dados, separados por vrgulas um item paracada uma das seis colunas da tabela LISTA_DE_HOSPEDES. O primeiro item de dados includo naprimeira 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    10/33

    SQL - Structure Query Language

    Como estamos incluindo dados em todas as colunas da tabela LISTA_DE_HOSPEDES, poderamos omitira lista dos nomes das colunas aps o nome da tabela. Esta lista s indispensvel caso estejamos incluindodados em apenas algumas colunas e no em todas; temos ento que indicar os nomes das colunas querecebero 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 (). Istose deve ao fato de que os dados das trs colunas so do tipo VARCHAR. Dados CHAR ou VARCHARusados em declaraes SQL devem aparecer entre apstrofes.

    3.Queries: Obtendo os Dados DesejadosA query o meio atravs do qual podemos pesquisar e obter dados das tabelas de um banco de dados. Aseguir abordamos os seus elementos bsicos, inclusive as duas clusulas essenciais obrigatrias em todas asqueries 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 euma clusula FROM. Em uma query simples, a clusula SELECT enumera os nomes das colunas quecontm 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, podemosrestringir a clusula SELECT de modo que se obtenha dados de apenas algumas colunas, ou, de outrasformas, 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 doresultado representam os dados que atendem s condies estabelecidas ou so o produto das operaesespecificadas 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, DESCONTOFROM LISTA_DE_HOSPEDES;

    NOME QUARTO TCNICO CHEGADA SADA DESCTOJANE FYUNDAI 3 JLIO 15-08-1997 17-08-1997 0.20MARCELO FREITAS 2 BRUNA 26-08-1997 0.10JANE FYUNDAI 4 SERENA 24-08-1997ALEXANDRE GOMES 1 RICARDO 14-08-1997 16-08-1997JOS AUGUSTO 7 JLIO 15-08-1997 19-08-1997MAURCIO DE SOUZA 5 RICARDO 25-08-1997 0.15BIANCA OLIVEIRA 6 BRUNA 15-08-1997 20-08-1997 0.05

    STELLA SHIELDS 8 SERENA 25-08-1997 0.15ALEXANDRE 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    11/33

    SQL - Structure Query Language

    Incidentemente, podemos usar um asterisco (*) em vez de nomes de colunas na clusula SELECT. Oasterisco representa os valores de todas as colunas. Usar o asterisco o mesmo que nomear todas ascolunas de uma tabela ou mais tabelas, na sua ordem original. Portanto, ao invs de digitar todos os nomesde 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 somenteda coluna NOME:SELECT NOMEFROM LISTA_DE_HOSPEDES;

    Podemos evitar que dados sejam exibidos duplicados, usando a palavra-chave DISTINCT imediatamenteaps a palavra SELECT na clusula SELECT para suprimir as linhas duplicadas do resultado. Noexemplo abaixo a palavra-chave DISTINCT foi acrescentada na query anterior:SELECT DISTINCT NOMEFROM 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 retornaros valores das expresses da clusula SELECT de todas as linhas, uma query com uma clusula WHEREretorna 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 expressesFROM estas tabelassomente nas linhas WHERE estas condies foram atendidas.

    As condies da clusula WHERE so chamadas de condies de pesquisa. O exemplo abaixo selecionadados das colunas NOME e TECNICO da tabela LISTA_DE_HOSPEDES somente nas linhas em que otcnico for a Bruna. Em outras palavras, a query lista os nomes (e tcnicos) de todas as pessoas cujo otcnico seja a Bruna:SELECT NOME, TECNICOFROM LISTA_DE_HOSPEDESWHERE TECNICO = BRUNA;

    NOME TCNICOMARCELO FREITAS BRUNA

    BIANCA OLIVEIRA BRUNAALEXANDRE GOMES BRUNA

    No obrigatrio citar na clusula WHERE somente colunas que apaream na clusula SELECT. A queryanterior funcionaria da mesma forma se eliminssemos a coluna TECNICO da clusula SELECT.SELECT NOMEFROM LISTA_DE_HOSPEDESWHERE TECNICO = BRUNA;

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 10

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    12/33

    SQL - Structure Query Language

    NOMEMARCELO FREITASBIANCA OLIVEIRA

    ALEXANDRE GOMES

    3.2.1. Predicados Relacionais

    No exemplo anterior, TECNICO = BRUNA um predicado relacional. O sinal de igualdade (=) umoperador relacional simples.

    Existem nove operadores relacionais simples, que podem formar nove tipos de predicados relacionaissimples 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 NOMEFROM LISTA_DE_HOSPEDESWHERE TECNICO = BRUNA;

    Como j foi dito, a query contm um operador relacional simples, o sinal de igualdade. Seu significadoseria traduzido assim:SELECT o valor de NOME e TECNICOFROM tabela LISTA_DE_HOSPEDESsomente 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    13/33

    SQL - Structure Query Language

    SELECT NOME, SAIDAFROM LISTA_DE_HOSPEDESWHERE SAIDA BETWEEN 19-08-1997 AND 24-08-1997;

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

    O operador IS NULL nos permite selecionar as linhas em que o valor de um determinado campo sejadesconhecido. Por exemplo, as linhas de vrios hspedes ficaram com a SAIDA em branco. Podemosselecionar os nomes destes hspedes utilizando o operador IS NULL.SELECT NOME, SAIDAFROM LISTA_DE_HOSPEDESWHERE SAIDA IS NULL;

    NOME SAIDAMARCELO FREITASJANE FYUNDAISTELLA SHIELDS

    O operador LIKE nos permite utilizar caracteres mscara para comparar dados em uma condio depesquisa. Em vez de os dados terem que ser idnticos, podemos especificar que sejam apenas semelhantesem 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 nomesque comecem com a seqncia de caracteres MA%;SELECT NOMEFROM LISTA_DE_HOSPEDESWHERE NOME LIKE MA%;

    NOME

    MARCELO FREITASMAURICIO DE SOUZA

    A prxima query seleciona todos os nomes que tenham a letra J na primeira posio e N na quarta, noimportando quais sejam os outros caracteres.SELECT NOMEFROM LISTA_DE_HOSPEDESWHERE NOME LIKE J__N;

    NOMEJANE FYUNDAI

    Mais um exemplo:SELECT NOME

    FROM LISTA_DE_HOSPEDESWHERE NOME LIKE _AR_E%;

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 12

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    14/33

    SQL - Structure Query Language

    NOMEMARCELO FREITAS

    O ltimo operador a ser discutido neste tpico o IN, que nos permite selecionar dados que se encaixemem um conjunto ou uma lista de valores. Os valores podem ser indicados explicitamente em umadeclarao, como nos exemplos a seguir.

    A query abaixo seleciona o nome, o tcnico e o quarto de cada hspede cujo o tcnico esteja presente nalista BRUNA, JULIO:SELECT NOME, TECNICO, QUARTOFROM LISTA_DE_HOSPEDESWHERE TECNICO IN (BRUNA, JULIO);

    NOME TCNICO QUARTOJANE FYUNDAI JLIO 3

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

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

    NOME QUARTO TCNICO

    ALEXANDRE GOMES 1 RICARDOMAURCIO DE SOUZA 5 RICARDOJANE FYUNDAI 7 SERENASTELLA 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 umacondio 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 cujoo tcnico seja Serena:SELECT NOME, TECNICO, DESCONTO

    FROM LISTA_DE_HOSPEDESWHERE SAIDA IS NULL AND TECNICO = SERENA

    NOME TCNICO DESCTOJANE FYUNDAI SERENASTELLA SHIELDS SERENA 0.15

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 13

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    15/33

    SQL - Structure Query Language

    Podemos acrescentar inmeras condies clusula WHERE usando os operadores AND e OR. A prximaquery acrescenta vrios componentes:SELECT NOME, QUARTO, TECNICO, CHEGADA, SAIDAFROM LISTA_DE_HOSPEDES

    WHERE SAIDA IS NULLAND TECNICO = ROBERTOAND QUARTO > 16AND CHEGADA < 20-08-97;

    4.Queries: Manipulando DadosA 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 deoperaes realizadas sobre os dados.

    Neste tpico, descrevemos trs elementos que viabilizam as operaes realizadas sobre os dados em umaquery. 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 paraformar 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 deDESCONTO na linha de Marcelo Freitas. A clusula SELECT contm duas expresses: NOME e aexpresso formada pelo operador aritmtico, DESCONTO + 0.05. A tabela resultado dever conter duascolunas, uma para cada expresso:SELECT NOME, DESCONTO + 0.05FROM LISTA_DE_HOSPEDESWHERE NOME = MARCELO FREITAS

    NOME DESCTOMARCELO FREITAS 0.15

    Embora as regras variem de implementao para implementao, algumas permitem ainda o uso deoperadores aritmticos com dados do tipo data e hora. Em SQL Base, por exemplo, a query abaixo pode serusada 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 - CHEGADAFROM LISTA_DE_HOSPEDESWHERE NOME = MARCELO FREITAS

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 14

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    16/33

    SQL - Structure Query Language

    4.2. Funes

    As funes constituem mais uma forma de usar queries para manipular os dados das tabelas. Uma funoretorna 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 colunainteira de dados. Portanto, enquanto qualquer outro tipo de expresso retorna um valor para cada linha, asfunes 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 argumentoMAX(argumento) Retorna o maior valor do argumentoMIN(argumento) Retorna o menor valor do argumentoSUM(argumento) Retorna o somatrio dos valores do argumentoCOUNT(argumento) Retorna a nmero de linhas do argumento

    As funes agregadas normalmente usam como argumento um nome de coluna ou uma expresso quetenha um nome de coluna como componente, mas podemos us-las com qualquer expresso numrica oude datas.

    A query a seguir l todos os valores da coluna DESCONTO e fornece os percentuais mdio, mximo emnimo de desconto oferecidos aos hspedes do Visual Spa. Como as funo AVG, MX, MIN e SUMignoram valores nulos, o valor AVG (mdia) realmente o desconto mdio apenas daqueles hspedes queobtiveram 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_HOSPEDESWHERE 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 deuma coluna inteira de dados. Em vez disto, as funes no agregadas, como todas as expresses que jdiscutimos (exceto as funes agregadas), retornam um valor para cada linha.

    Em SQL Base, as funes agregadas comeam sempre com o caractere @, mas esta conveno spertence ao SQL Base. Nos outros aspectos, a sintaxe das funes no agregadas igual a das agregadas: afuno 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, demodo 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 quaiscompes o argumento da funo @PROPER. Esta funo coloca apenas a primeira letra de cada palavra deseu argumento em letra maiscula e as restantes em letra minscula, como na representao de nomesprprios. Neste caso, @PROPER converte JOSE em Jose.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 15

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    17/33

    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 sedispes a examin-las detalhadamente. Apresentamos neste prximo tpico apenas alguns exemplosrepresentativos oferecidos pelo SQL Base.

    O exemplo abaixo usa a funo @LENGTH (seqncia de caracteres). Colocamos a expresso seqnciade caracteres entre parnteses para indicar que esta funo utiliza seqncias de caracteres comoargumentos. Ela retorna o nmero de caracteres existentes no argumento. Neste caso, usamos a funo parainformar 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 12MARCELO FREITAS 15JOS AUGUSTO 12

    BIANCA OLIVEIRA 15ALEXANDRE GOMES 15

    SELECT NOME, @PROPER(@LENGTH(NOME,5))FROM LISTA_DE_HOSPEDES;

    NOME @PROPER(@LENGTH (NOME,5))JANE FYUNDAI janeMARCELO FREITAS marceJOS AUGUSTO josBIANCA OLIVEIRA biancALEXANDRE 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 geramresultados 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 15MARCELO FREITAS 26-08-1997 26

    ALEXANDRE GOMES 14-08-1997 14JOS 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    18/33

    SQL - Structure Query Language

    5.Organizando o Resultado

    5.1. Clusula GROUP BYA clusula GROUP BY rene diferentes linhas do resultado de uma query em conjuntos de acordo com ascolunas nela mencionadas, chamadas colunas formadoras de grupos. As linhas so agrupadas de duasformas, ou em dois aspectos.

    A query abaixo exemplifica a primeira forma, na qual todas as linhas que contm o mesmo valor naprimeira coluna especificada so exibidas em grupos no resultado. Neste caso, a primeira coluna formadorade grupo TECNICO. Todas as linhas que tenham o mesmo valor na coluna TECNICO aparecero juntasno resultado:SELECT TECNICO, NOMEFROM LISTA_DE_HOSPEDESGROUP BY TECNICO, NOME;

    TCNICO NOMEBRUNA MARCELO FREITASBRUNA BIANCA OLIVEIRABRUNA ALEXANDRE GOMESJLIO JANE FYUNDAIJLIO JOS AUGUSTORICARDO ALEXANDRE GOMESRICARDO MAURCIO DE SOUZASERENA JANE FYUNDAISERENA STELLA SHIELDS

    Se houvesse linhas em que a coluna TECNICO estivesse em branco, ou seja, com um valor nulo paraTECNICO, 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 duascolunas.

    Obs.: As funes agregadas AVG, SUM, MAX, MIN e COUNT no podem ser usadas em clusulasGROUP 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, aGROUP BY codificada depois da clusula WHERE. Por exemplo, a query abaixo exibe os nomes doshspedes que chegaram depois do dia 15 de agosto por tcnico:SELECT TECNICO, NOMEFROM LISTA_DE_HOSPEDESWHERE CHEGADA > 15-08-97GROUP BY TECNICO, NOME;

    5.2. Clusula HAVINGA clusula HAVING nos permite estreitar a rea de atuao da clusula GROUP BY da mesma forma quea clusula WHERE estreita a rea de atuao da clusula SELECT, ou seja, atravs de uma condio depesquisa.

    Ao contrrio da clusula WHERE, no entanto, a clusula HAVING pode conter funes agregadas.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 17

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    19/33

    SQL - Structure Query Language

    Uma nova tabela, HOSPEDES_PS, ser usada nos exemplos deste tpico. Criamos uma tabela com adeclarao CREATE TABLE abaixo. Esta tabela se destina a registrar as pesagens peridicas dos hspedesdo 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 palavrasreservadas no podem ser usadas como nomes de colunas ou outros identificadores, a no ser que entreaspas.

    Aps a incluso dos dados, a tabela HOSPEDE_PS tem a seguinte aparncia:SELECT * FROM HOSPEDE_PS

    NOME PESO QUANDOJANE FYUNDAI 68 14-08-97MARCELO FREITAS 59 14-08-97ALEXANDRE GOMES 86 15-08-97JOS AUGUSTO 87 15-08-97MAURCIO DE SOUZA 68.5 15-08-97JANE FYUNDAI 67.5 16-08-97MARCELO FREITAS 55 16-08-97ALEXANDRE GOMES 84 17-08-97JOS AUGUSTO 84 17-08-97MAURCIO 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. Aquery a seguir indica os hspedes que tiveram uma diferena acima de um entre seu peso mnimo e seupeso mximo. Observe a presena de funes agregadas na clusula HAVING.SELECT HOSPEDE, MIN(PESO), MAX(PESO) MIN(PESO)

    FROM HOSPEDE_PSGROUP BY HOSPEDEHAVING MAX(PESO) MIN(PESO) > 1;

    NOME MIN(PESO) MAX(PESO)

    MAX(PESO)-MIN(PESO)

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

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

    5.3. Clusula ORDER BY

    A clusula ORDER BY nos permite classificar as linhas do resultado alfabtica e numericamente, emordem crescente ou decrescente. O default a ordem crescente. A clusula ORDER BY sempre a ltimaclusula 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-chaveDISTINCT para suprimir as linhas duplicadas:

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 18

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    20/33

    SQL - Structure Query Language

    SELECT DISTINCT NOMEFROM LISTA_DE_HOSPEDESORDER BY NOME DESC;

    NOMESTELLA SHIELDSMAURCIO DE SOUZAMARCELO FREITASJOS AUGUSTOJANE FYUNDAIJANE FYUNDAIBIANCA OLIVEIRAALEXANDRE GOMESALEXANDRE 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 TabelaPor muitas vezes, os dados que desejamos no esto contidos em uma s tabela. Por exemplo, para obter aaltura e o nome do tcnico de Bianca Oliveira, temos que pesquisar em duas tabelas. O nome de seu tcnicoest 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 ALTURAJOS AUGUSTO M M 1,67MAURCIO DE SOUZA M M 1,72BIANCA OLIVEIRA F G 1,65JANE FYUNDAI F G 1,80STELLA SHIELDS F M 1,65ROGRIO NUNES M M 1,78

    A query a seguir obtm a altura de Rogrio Nunes :SELECT NOME, ALTURAFROM HOSPEDESWHERE NOME = BIANCA OLIVEIRA;

    NOME ALTURABIANCA OLIVEIRA 1,65

    A prxima query obtm seu tcnico da tabela LISTA_DE_HOSPEDES:SELECT NOME, TECNICOFROM LISTA_DE_HOSPEDESWHERE NOME = BIANCA OLIVEIRA;

    NOME TECNICOBIANCA 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 nacondio de juno indicada na clusula WHERE. Temos abaixo uma juno que fornece a altura e otcnico de todos os hspedes:SELECT HOSPEDES.NOME, ALTURA, TECNICO

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 19

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    21/33

    SQL - Structure Query Language

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

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

    Podemos traduzir a query da seguinte maneira: Para todas as linhas de HOSPEDES eLISTA_DE_HOSPEDES cujo o valor de HOSPEDES.NOME seja igual ao deLISTA_DE_HOSPEDES.NOME, obtenha os respectivos NOME e ALTURA de HOSPEDES e oTECNICO de LISTA_DE_HOSPEDES.

    6.1. EquijunesA ltima query que analisamos um exemplo de equijuno uma juno baseada em uma condio deigualdade. Outros tipos de predicados relacionais podem constituir outros tipos de condio de juno, dosquais veremos alguns exemplos. Porm de antemo sabemos que o tipo mais comum o de igualdade aequijuno.

    Para que possamos dar um exemplo um pouco diferente, criaremos uma nova tabela, QUARTOS, que irconter 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 seguinteaparncia:

    SELECT QUARTO, NOME, TAXAFROM QUARTOS;

    QUARTO NOME TAXA1 ANA PAULA 3002 CARMEM SOUZA 3003 CRISTIANO BEZERRA 2504 MARCONE ALMEIDA 3255 MARIA FERREIRA 250

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 20

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    22/33

    SQL - Structure Query Language

    Segue-se ento o exemplo de equijuno. Para efeito de demonstrao, a equijuno encontra-se emuma clusula AND. Observe, tambm, que nenhuma das duas colunas unidas, QUARTO da tabelaQUARTOS e da LISTA_DE_HOSPEDES, aparece na lista do SELECT.SELECT LISTA_DE_HOSPEDES.NOME, QUARTOS.NOME, QUARTOS.TAXA,

    LISTA_DE_HOSPEDES.DESCONTOFROM QUARTOS, LISTA_DE_HOSPEDESWHERE LISTA_DE_HOSPEDES.NOME = JANE FYUNDAIAND QUARTOS.QUARTO = LISTA_DE_HOSPEDES.QUARTO;

    LISTA_DE_HOSPEDES.NOME

    QUARTOS.NOME QUARTOS.TAXA LISTA_DE_HOSPEDES.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 doshspedes 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, quecontm os registros de todos os hspedes, atuais e passados.

    Podemos, para isso, usar esta query, uma simples equijuno:

    SELECT HOSPEDES.NOME, SEXO, BIOTIPO, ALTURA, TECNICOFROM HOSPEDES, LISTA_DE_HOSPEDESWHERE HOSPEDES.NOME = LISTA_DE_HOSPEDES.NOME;

    NOME SEXO BIOTIPO ALTURA TECNICOJOS AUGUSTO M M 1,67 JULIOMAURCIO DE SOUZA M M 1,72 RICARDOBIANCA OLIVEIRA F G 1,65 BRUNA

    JANE FYUNDAI F G 1,80 JULIOSTELLA SHIELDS F M 1,65 SERENAROGRIO NUNES M M 1,78 SERENACLINT WESTWOOD M M 1,85 RICARDO

    Uma juno externa nos permite unir tabelas atravs de colunas com nmeros diferentes de linhas, sem queas linhas comuns s duas sejam excludas da tabela resultado. Ao contrrio, as linhas exclusivas de apenasuma das tabelas so includas no resultado, com valores nulos em quaisquer colunas da outra tabela, ondeaquelas linhas no existem.

    O recurso de junes externas s existe em poucas implementaes da linguagem SQL. Entretanto, porconsider-lo importante e como possivelmente ser implementado em maior escala no futuro, vamosanalisar 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 demaislinhas da tabela no contidas no resultado simples: basta acrescentar um sinal de adio (+) ao lado donome da coluna que no possui as linhas externas, ou seja, aquela na qual incluiremos valores nulos noresultado, na condio de juno. Ex.:SELECT HOSPEDES.NOME, SEXO, BIOTIPO, ALTURA, TECNICOFROM HOSPEDES, LISTA_DE_HOSPEDESWHERE 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 detratarmos uma nica tabela como se fosse na verdade duas tabelas, a fim de possibilitar certos tipos dequeries.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 21

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    23/33

    SQL - Structure Query Language

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

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

    Poderamos, evidentemente, usar uma query para selecionar DESCONTO onde NOME fosse igual aMAURICIO DE SOUZA e, em seguida, uma outra que selecionasse NOME e DESCONTO ondeDESCONTO fosse igual ao resultado da primeira query. Mais digamos que quisssemos optar por umaforma mais elegante e menos trabalhosa usar uma nica query.

    Esta tarefa parece bastante simples. Poderamos comear a construir a query assim:

    SELECT NOME, DESCONTOFROM LISTA_DE_HOSPEDESWHERE DESCONTO = ...?

    Entretanto, neste ponto chegamos a um impasse. Queremos dizer WHERE DESCONTO = (o desconto deMaurcio de Souza), mas no vemos como.

    Observe como seria fcil resolver este problema se, ao invs de lida com apenas uma tabela, estivssemoslidando com duas, a fim de obter o desconto de Maurcio de Souza de uma e as informaes sobre osoutros 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.DESCONTOFROM LISTA_DE_HOSPEDES A, LISTA_DE_HOSPEDES_BWHERE A.DESCONTO = B.DESCONTOAND B.NOME = MAURICIO DE SOUZA;

    NOME DESCTOMAURCIO DE SOUZA 0.15

    STELLA SHIELDS 0.15Como 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 definidosna lista do FROM, na qual estabelecemos que a tabela em questo passa a ser conhecida por estes nomes. Apartir da, todos os nomes de colunas que quisermos usar tero como prefixo estes nomes correlatos.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 22

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    24/33

    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 maiorque (>).

    Eventualmente junes como esta, no baseadas em uma relao de igualdade, so conhecidas como noequijunes. O termo engloba todas as junes que utilizem qualquer operador relacional exceto o deigualdade ( = ).

    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 sosuprimidas.

    As queries vinculadas tm que ter o mesmo nmero de elementos na lista do SELECT, e os tipos de dadose tamanho tm que coincidir coluna a coluna. Por exemplo, se a primeira coluna da lista do SELECT daprimeira query for do tipo VARCHAR(25), ento a primeira coluna da lista do SELECT de cada uma dasqueries subseqentes na declarao UNION tem que ser tambm do tipo VARCHAR(25). No poderiamser colunas VARCHAR(8) e nem colunas numricas ou de data e hora. Se, por fim, uma das colunas fordefinida 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 tabelaLISTA_DE_HOSPEDES. Como as linhas duplicadas so eliminadas, o resultado ser exatamente o mesmoque o da primeira query.

    Ambas da colunas so do tipo VARCHAR.SELECT NOME FROM HOSPEDESUNIONSELECT NOME FROM LISTA_DE_HOSPEDES;

    NOMEJOS AUGUSTOMAURCIO DE SOUZABIANCA OLIVEIRAJANE FYUNDAISTELLA SHIELDSROGRIO NUNES

    As declaraes SELECT em uma UNION podem conter funes e clusulas WHERE e GROUP BY, euma 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 selecionardados para uma query externa, pode ser usado para incluir dados quando a declarao externa for umINSERT.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 23

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    25/33

    SQL - Structure Query Language

    Suponhamos que quisssemos criar uma tabela HOSPEDES_HOMENS, idntica HOSPEDES, exceode 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 listaro 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 epodem ser extrados e includos atravs de uma declarao INSERT contendo uma query.INSERT INTO HOSPEDES_HOMENSSELECT NOME, BIOTIPO, ALTURAFROM HOSPEDESWHERE 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 nossoexemplo, 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 colunasna tabela de destino. Por exemplo, nmeros podem ser includos em uma coluna de tipo caractere, maso contrrio no aceito.

    8.Alterando Tabelas e DadosAt agora lidamos a maior parte do tempo com as queries declaraes SELECT que nos permitem, deuma forma ou de outra, obter dados de uma tabela. Nesta etapa da apostila, discutiremos exemplos de doisoutros tipos de declaraes SQL: declaraes de manipulao de dados, usadas para alterar os dados deum banco de dados, e declaraes de definio de dados, que servem para fazer alteraes na estrutura dobanco 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. Comoo INSERT as duas declaraes nos permitem alterar o contedo do banco de dados. UPDATE altera linhasexistentes 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 adeclarao UPDATE abaixo para fazer esta alterao na tabela LISTA_DE_HOSPEDES:UPDATE LISTA_DE_HOSPEDESSET NOME = ANDREWHERE NOME = ALEXANDRE;

    O nome da tabela ou viso a ser atualizada indicado na primeira linha do exemplo. Na segunda linhaaparece o nome da coluna a ser atualizada e o tipo de alterao, e na terceira a condio de pesquisa. Comonas 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    26/33

    SQL - Structure Query Language

    Podemos usar a declarao UPDATE para realizar as duas alteraes de uma s vez. A segunda condiode pesquisa, especificando a data de chegada, necessria pois existem dois quartos ocupados pelo Andrem LISTA_DE_HOSPEDES, e s queremos alterar um deles.UPDATE LISTA_DE_HOSPEDES

    SET QUARTO = 7, DESCONTO = DESCONTO + 0.02WHERE NOME = ALEXANDREAND CHEGADA = 17-08-97;

    Como podemos observar no exemplo, possvel alterar mais de uma coluna ao mesmo tempo e usarexpresses 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. Damesma forma que com o UPDATE, qualquer linha que seja eliminada de uma viso ser tambm eliminadada tabela original.

    A declarao abaixo elimina da tabela LISTA_DE_HOSPEDES todas as linhas de hspedes que tenhamuma data de sada registrada:DELETE FROM LISTA_DE_HOSPEDESWHERE 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 dadeclarao:ROLLBACK;

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

    8.2. Alterando uma Tabela

    Alm de alterar os dados de uma tabela, a SQL nos permite tambm alterar a sua estrutura, atravs dadeclarao ALTER TABLE. Uma outra declarao, DROP, que ser discutida no final deste tpico, servepara eliminar a tabela completamente.

    O nmero exato de caractersticas da tabela que podemos alterar varia em funo da implementao dadeclarao 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 amaioria das implementaes, limita as opes em duas, ADD e MODIFY. O SQL Base complementa estepadro 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    27/33

    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 colunaMODIFY (modificar) o tamanho de uma coluna ou se a colunadever aceitar valores nulos.

    DROP (eliminar) uma coluna existenteRENAME (trocar o nome de) uma coluna existenteRENAME 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 colunaDESCONTO da LISTA_DE_HOSPEDES da seguinte forma:ALTER TABLE LISTA_DE_HOSPEDESDROP DESCONTO;

    Poderamos, se desejado, eliminar mais de uma coluna da tabela em uma s declarao, separando osnomes das colunas por vrgulas, da mesma forma que na lista do SELECT. Por exemplo:ALTER TABLE LISTA_DE_HOSPEDESDROP QUARTO, SAIDA;

    Entretanto, no poderamos usar a declarao ALTER TABLE para alterar mais de uma tabela ao mesmotempo.

    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 dadoque ir conter, o tamanho (quando necessrio) e se aceitar ou no valores nulos, exatamente da mesmaforma 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_HOSPEDESADD DESCONTO DECIMAL(2,2);

    Especificamos que a nova coluna do tipo DECIMAL e o seu tamanho (2,2). Como queramos que acoluna 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 foramincludos dados nela. Mesmo que tivssemos especificado NOT NULL, a coluna conteria valores nulosiniciais. 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 ascolunas SAIDA e GARCOM:ALTER TABLE LISTA_DE_HOSPEDESADD SAIDA DATE, GARCOM VARCHAR(10);

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 26

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    28/33

    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 colunade 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 noque passe a ser do tipo INTEGER.

    Podemos, ainda, fazer com que uma coluna que no aceite valores nulos passe a aceitar e tambm podemosfazer o inverso, desde que a coluna no contenha nulos.

    Por exemplo, no contm valores nulos na coluna TECNICO de LISTA_DE_HOSPEDES; entopoderamos, se necessrio, fazer com que TECNICO passasse a ser NOT NULL. J no podemos fazer omesmo 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 NOTNULL: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_HOSPEDESMODIFY 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_HOSPEDESRENAME 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 estaindicado na clusula ALTER TABLE, s temos que especificar o novo nome na clusula RENAMETABLE.

    A declarao abaixo altera o nome da tabela LISTA_DE_HOSPEDES para LISTA:ALTER TABLE LISTA_DE_HOSPEDESRENAME 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 umsinnimo. Neste tpico, descrevemos apenas a eliminao de tabelas e vises. ndices e sinnimos seroestudados 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 sinnimosdefinidos 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 erroindicando que a tabela no existe.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 27

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    29/33

    SQL - Structure Query Language

    9.Utilizando ndice para Melhorar a PerformanceObserve 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 tambmpercorreria 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 formaque, sempre que for mencionada em uma query, o sistema usar o ndice para ter acesso direto aos dadosdesejados, ao invs de vasculhar a coluna toda. Os ndices so ento muito teis s queries que se referem auma nica linha. Em termos gerais os ndices so teis em qualquer coluna que seja consultadafreqentemente.

    Criamos um ndice com a declarao CREATE INDEX, e ele automaticamente atualizado quando acoluna (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 foicriada 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. Noentanto, devemos considerar o fato de que ocupam bastante espao em disco e seria aconselhvel no criartantos 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 decidequal a melhor maneira de extrair os dados solicitados por uma query. o otimizador que escolhe quaisndices 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, ALTURAFROM LISTA_DE_HOSPEDES A, HOSPEDES BWHERE 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 aindexao em ordem crescente ou decrescente. O default a ordem crescente.CREATE INDEX NOME_IDON 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 tabelatambm.

    No especificamos que NOME_ID deveria ser um ndice nico, pois a colunaLISTA_DE_HOSPEDES.NOME contm nomes repetidos. Existem hspedes que j fizeram duas visitasno Spa. Um ndice nico no pode ser criado em uma coluna ou grupo de colunas que contenha linhasduplicadas.

    A tabela HOSPEDES, porm, representa o nosso arquivo contendo todos os hspedes passados e atuais, noqual 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 nossondice nico.

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 28

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    30/33

    SQL - Structure Query Language

    A declarao abaixo cria um ndice nico na coluna NOME da tabela HOSPEDES:CREATE UNIQUE INDEX NOME1_INDON 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 ndicesque 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 aaltura 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_MAX1,67 M M 56 58.51,72 M M 57 59.51,65 F G 57.5 601,80 F G 72 78.51,65 F M 73.5 801,78 M M 75 82.51,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 oshspedes. NOME e TECNICO vm da LISTA_DE_HOSPEDES; a altura, o sexo e o biotipo so obtidosda tabela HOSPEDES e so usados para localizar a respectiva faixa no QUADRO_DE_PESOS:SELECT A.NOME, TECNICO, PS_MIN, PS_MAXFROM LISTA_DE_HOSPEDES A, HOSPEDES B, QUADRO_DE_PESOS CWHERE A.NOME = B.NOMEAND B.SEXO = C.SEXOAND B.ALTURA = C.ALTURAAND 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_INDON 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 umndice manualmente, usamos a declarao DROP INDEX, que a mesma declarao usada para apagartabelas. 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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    31/33

    SQL - Structure Query Language

    10.Programando em SQLNo incio desta apostila, vimos como usar a linguagem SQL de modo interativo, ou seja, como executar asdeclaraes 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 linguageminterativa. 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 foiprojetada para realizar.

    10.2. Utilizando a Ferramenta ACCESS

    Para que possamos entender melhor a SQL, utilizaremos um Sistema de Gerenciamento de Banco deDados 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 iremosutilizado para manipulao de dados.

    Ao iniciar o Access aparecer a seguinte tela:

    Luis Fernando Calbria/Erick Franklin/Leonardo Bandeira Pgina 30

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    32/33

    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 emseguida o boto OK. O arquivo encontra-se na seguinte pasta "C:\Arquivos de Programas\MicrosoftOffice\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

  • 8/6/2019 TI - Linguagem SQL ANSI - Concursos

    33/33

    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 consultaclique 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.