Вы находитесь на странице: 1из 62

INTRODUO AO SQL EM INFORMIX

Manual de introduo ao SQL em Informix

Pgina 1

1. INTRODUO .............................................................................................................................................3 1.1. NOES DE BASES DE DADOS RELACIONAIS: UM EXEMPLO .........................................................................3 1.1.1. Estrutura duma tabela ...........................................................................................................................4 1.2. DBACCESS..................................................................................................................................................6 1.2.1. Os ecrans do DBACCESS......................................................................................................................6 1.2.2. As opes do Main Menu.......................................................................................................................7 1.2.3. Ambiente do INFORMIX .......................................................................................................................7 2. RDSQL .........................................................................................................................................................12 2.1. ACEDENDO AO RDSQL...............................................................................................................................12 2.2. AS OPES DO RDSQL...............................................................................................................................12 2.3. REGRAS PARA ESCREVER INSTRUES DE RDSQL......................................................................................13 2.4. COMO USAR BASES DE DADOS E TABELAS............................................................................13 2.5. CRIAO DUMA BASE DE DADOS - CREATE DATABASE........................................................................13 2.5.1. Seleco da Base de Dados Actual - DATABASE. .............................................................................14 2.5.2. Criao duma Tabela - CREATE TABLE............................................................................................14 2.5.3. Informaes sobre uma tabela - INFO................................................................................................17 2.5.4. Alteraes ao Formato das Tabelas - ALTER TABLE, RENAME TABLE, RENAME COLUMN .......17 2.5.5. Supresso duma Tabela - DROP TABLE. ...........................................................................................18 2.5.6. Supresso duma Base de Dados - CLOSE DATABASE, DROP DATABASE......................................18 2.6. MANIPULAO DE DADOS ...........................................................................................................................18 2.6.1. Como Consultar uma Tabela - SELECT..............................................................................................19 2.6.2. Insero de Linhas num Tabela - INSERT ..........................................................................................33 2.6.3. Alterao dos Valores duma Tabela - UPDATE ................................................................................35 2.6.4. Supresso de Linhas duma Tabela - DELETE ....................................................................................36 2.7. INDICES.......................................................................................................................................................36 2.7.1. Criao dum indice - CREATE INDEX..............................................................................................37 2.7.2. Como Retirar um Indice - DROP INDEX...........................................................................................37 2.7.3. Indices Cluster - ALTER INDEX ........................................................................................................38 2.7.4. Alguma Estratgias de Indexao ......................................................................................................38 2.8. APROFUNDAMENTO DAS POSSIBILIDADES DO SELECT ..............................................................................39 2.8.1. Funes Agregadas .............................................................................................................................39 2.8.2. Funes sobre Datas ..........................................................................................................................41 2.8.3. A Clusula GROUP BY ......................................................................................................................42 2.8.4. A Clusula HAVING...........................................................................................................................43 2.8.5. Operador UNION ...............................................................................................................................44 2.8.6. JOIN - Seleco de Linhas em mais de uma Tabela...........................................................................46 2.8.7. Subqueries ..........................................................................................................................................48 2.8.8. INTO TEMP - Criao dum Resultado numa Tabela Temporria.....................................................52 2.9. VIEWS .........................................................................................................................................................53 2.10. TRANSACES ..........................................................................................................................................55 2.11. SEGURANA..............................................................................................................................................57 2.11.1. Autorizaes .....................................................................................................................................57 2.11.2. Recuperao de Dados.....................................................................................................................58 3. APNDICE 1 ..............................................................................................................................................59

Manual de introduo ao SQL em Informix

Pgina 2

1. INTRODUO

A linguagem RDSQL a linguagem de acesso base de dados fornecida pela informix. O utilitrio dbaccess fornecido com os motores de dases de dados, e permite a execuo do RDSQL interactivo e gesto bsica da estrutura da base de dados.

1.1. Noes de Bases de Dados Relacionais: Um exemplo

Para uma melhor apreenso global e integrada dos comandos do RDSQL que iro ser focados ao longo deste manual, todos os exerccios de aplicao sero executados no contexto da base de dados de aprendizagem STORES que se descreve a seguir. Durante a apresentao da base de dados STORES iro sendo introduzidos e explicados conceitos e termos utilizados no Modelo Relacional, que normalmente se utiliza para descrever uma base de dados relacional.

STORES A base de dados STORES pretende ser o suporte da informao necessria gesto duma firma que comercializa artigos de desporto.

Manual de introduo ao SQL em Informix

Pgina 3

Na base de dados STORES existem as seguintes tabelas: (consulte os documentos 'Modelo de Dados' e 'Detalhe das entidades do apndice 1). 1 customer CLIENTES: Contm informaes sobre 18 distribuidores dos artigos comercializados. Inclui o nmero de identificao, nome, morada e nmero de telefone do cliente.

2. orders ENCOMENDAS: Contm encomendas pedidas pelos clientes registados na tabela customer. Inclui o nmero de identificao da encomenda, identificao do cliente, datas e outras caracteristicas da encomenda. 3. itens LINHAS DE ENCOMENDA: Contm informaes sobre o artigo encomendado. Inclui o nmero do artigo, a identificao do fabricante, a quantidade do artigo encomendada e o valor da linha de encomenda. 4. stocks ARTIGOS: Contm as caractersticas de cada artigo. Inclui o nmero de

identificao, fabricante, descrio e preo de cada artigo. 5. manufact FABRICANTE: Contm a identificao e o nome do fabricante.

1.1.1. Estrutura duma tabela

A estrutura duma tabela relacional constituda por um determinado nmero de colunas ,tendo todos os elementos de cada coluna as mesmas caractersticas, e por um nmero indeterminado de linhas constitudas por um elemento de cada uma das colunas (ver fig 1).

Manual de introduo ao SQL em Informix

Pgina 4

lin lin lin . . . lin

1 2 3

col1 1 2 3

col2 azul azul verde

col3 metal madeira metal

col4 500 200 500

n Fig. 1

Como se pode ver existe uma correspondncia entre uma tabela e um ficheiro sequncial. Assim: TABELA linha coluna FICHEIRO SEQUNCIAL registo campo

CHAVES PRIMRIAS Existem dois tipos de colunas numa tabela: 1A(s) coluna(s) que identificam cada uma das linhas da tabela s quais se chama CHAVE PRIMRIA da tabela ou entidade, pois o identificador da entidade. 2As restantes colunas da tabela e que tm cada uma delas uma relao binria com a chave primria.

CHAVES ESTRANGEIRAS A ligao entre ENTIDADES (tabelas) feita atravs de determinadas colunas da primeira entidade ujos valores seleccionam na segunda entidade a(s) linha(s) que tenham chaves primaris correspondentes. s colunas da primeira tabela que so utilizadas desta forma e no fazem parte da chave primria chamam-se CHAVES ESTRANGEIRAS ou SECUNDRIAS. No apndice 1 apresentam-se os seguintes 4 documentos que descrevem a base de dados STORES e se evidenciam os conceitos descritos nos pargrafos anteriores. Modelo de Dados Detalhe das Entidades Lista de Entidades descreve a base de dados descreve as tabelas. lista as tabelas com as respectivas chaves primrias e estrangeiras.

Esquema grfico representando as 5 tabelas da base de dados e a forma como se ligam entre si.

Manual de introduo ao SQL em Informix

Pgina 5

1.2. DBACCESS

DBACCESS um utilitrio fornecido com o Sistema de Gesto de Bases de Dados Relacionais Informix e que executa as seguintes tarefas: Criar Bases de Dados e Tabelas. Carregar dados de ficheiros do sistema operativo. Fazer buscas atravs de SQL (System Query Language) interactivo.

Para aceder ao DBACCESS digite dbaccess e aparecer no ecran o Main Menu do dbaccess, se este estiver bem instalado.

1.2.1. Os ecrans do DBACCESS

O DBACCESS usa 2 tipos de ecrans; o ecran de Menu e o ecran para entrada de texto.

Os Ecrans de Menu Os ecrans de Menu so do tipo do Main Menu. A primeira linha do ecran contm as opes do ecran de menu. A linha do ecran contm a descrio da opo actualmente seleccionada. Como seleccionar as opes do ecran de Menu Para seleccionar as vrias opes do ecran de Menu pode usar um dos mtodos seguintes : Seleccionar a opo pretendida, percorrendo as opes disponveis com a tecla SPACEBAR ou com as teclas de deslocaco do cursor "->" e "<-", e premir a tecla RETURN. Premir a primeira letra da opo que pretenda seleccionar. Tanto faz digitar quer a letra maiscula quer a letra minscula. Como Abandonar o Menu Em todos os ecrans de menu existe a opo EXIT utilizada para abandonar o menu.

Como Chamar pelo Help Sempre que tenha dificuldades em interpretar as opes do menu digite CTRL-W e aparecero no ecran uma srie de mensagens descrevendo a opo seleccionada. Para retornar ao ecran de menu pressione RETURN

Ecrans com Linhas de Pergunta Manual de introduo ao SQL em Informix Pgina 6

Estes ecrans no tm opes e permitem introduzir os novos nomes de bases de dados, tabelas, ficheiros com instrues RDSQL, etc. Depois de introduzido o texto pressione RETURN e o Informix-SQL processar a(s) tarefa(s) seleccionada(s).

Como nestes ecrans no existe opo EXIT para abandonar o ecran de entrada de texto e voltar ao menu anterior deve pressionar a tecla DEL.

O procedimento para chamar pelo HELP idntico ao do ecran de menu, ou seja deve digitar CTRLW.

1.2.2. As opes do Main Menu

As tarefas que o DBACCESS permite executar so sempre iniciadas a partir de seleco duma opo do Main Menu.

As opes do Main Menu so as seguintes :

Query - Language

Permite a utilizao do RDSQL, que uma linguagem do INFORMIX-SQL que

utiliza o standard SQL (System Query Language). Database Permite criar e retirar uma base de dados e torn-la na base de dados corrente. Table Exit Permite criar, retirar e modificar uma tabela e consultar informaes sobre a tabela. Permite sair do DBACCESS e voltar ao sistema operativo.

1.2.3. Ambiente do INFORMIX

H trs variveis de ambiente que tm de estar correctamente definidas para que o INFORMIX-SQL possa funcionar. Duas destas variveis (PATH, TERM) so variveis gerais do UNIX, a outra INFORMIXDIR, especfica dos produtos da Informix Inc. H um conjunto de variveis de ambiente especficas do INFORMIX que lhe afectam o comportamento, cujo nome comea sempre pelas letras "DB", algumas variveis do S.O. UNIX afectam tambm o comportamento do INFORMIX.

INFORMIXDIR

Num primeiro passo para a utilizao do INFORMIX-SQL, necessrio saber

onde foram instalados os programas. Todos os programas distribuidos com o INFORMIX-SQL

Manual de introduo ao SQL em Informix

Pgina 7

esto armazenados num conjunto de subdirectrios abaixo de um directrio principal (Ex: "/usr/informix" nas mquinas UNIX, "informix" nas mquinas DOS). Se o produto foi instalado noutro directrio (por ex: "/u0/informix"), ento necessrio diz-lo ao INFORMIX-SQL, definindo a varivel INFORMIXDIR. Se estiver a INFORMIXDIR=/u0/informix export INFORMIXDIR

Usando o C shell (csh) a sintaxe : setenv INFORMIXDIR \u0\informix

No caso de se estar num sistema DOS (MS-DOS ou PC-DOS) ento a sintaxe : set INFORMIXDIR=C:\u0\informix

Para que no seja necessrio proceder a esta operao em cada sesso de trabalho pode modificar-se o ficheiro .profile (sh ou ksh) ou .login (csh) ou AUTOEXEC.BAT (DOS). Esta tcnica aplica-se a todas as variveis de ambiente. NOTA: Em algumas mquinas se o INFORMIX-SQL for instalado no seu local por defeito (/usr/informix em UNIX), ento no necessrio definir a varivel INFORMIXDIR. No entanto aconselha-se a que se defina sempre esta varivel.

PATH

A segunda varivel a definir serve para ter a certeza de que o interpretador dos comandos ou o shell saibam onde esto os comandos do INFORMIX, esta uma varivel do S.O. UNIX, para mais pormenores deve consultar-se a documentao do Sistema Operativo. Todos os comandos esto instalados em "$INFORMIXDIR/bin" (isto , "/usr/informix/bin"). Ento a forma de inicializar a varivel PATH , por exemplo: PATH=$INFORMIXDIR/bin:$PATH export PATH

INFORMIX TERM

Existem no UNIX duas bases de dados de capacidades dos terminais termcap e terminfo. Para escolher a que deseja utilizar dever activar a varivel INFORMIXTERM com um dos valores atrs descritos, como por exempllo:

Manual de introduo ao SQL em Informix

Pgina 8

INFORMIXTERM=termcap export INFORMIXTERM

TERM e TERMCAP

Tal como a maioria dos produtos para o sistema UNIX, o INFORMIX-SQL

trabalha com quase todo o tipo de terminais. Os produtos Informix usam o ficheiro de descrio de terminais termcap normal do sistema UNIX. No caso de o ficheiro "/etc/termcap" no existir ou de se pretender usar caractersticas do terminal no definidas na descrio standard do UNIX, necessrio inicializar convenientemente a varivel de ambiente TERMCAP, do seguinte modo: TERMCAP=$INFORMIXDIR/etc/termcap export TERMCAP

pois vem com o INFORMIX-SQL um ficheiro onde esto definidos a maioria dos terminais. Este encontra-se no directrio "etc" abaixo do directrio onde foi instalado o INFORMIX-SQL.

DBDATE Consideremos o seguinte formato de data "06/09/88", para os americanos l-se 9 de Junho de 1988; para os europeus l-se 6 de Setembro de 1988. Pode-se definir como se quer que o INFORMIX-SQL interprete esta data, para isso necessrio inicializar correctamente a varivel DBDATE. O formato por defeito : DBDATE=mdy2/ export DBDATE

Esta varivel deve conter uma sequncia das letras "m", "d" e "y" por qualquer ordem para indicar qual a ordem em que aparecem respectivamente o ms, o dia e o ano, um caracter separador dos dias meses e anos (usalmente "/" ou "-"), e o nmero de digitos do ano (2 ou 4). O exemplo acima indica que os elementos introduzidos numa varivel tipo data esto com a ordem ms, dia, ano, que se tem 2 digitos para o ano e que o caracter separador "/". Pode-se inicializar a varivel DBDATE de qualquer uma das formas apresentadas a seguir:

Manual de introduo ao SQL em Informix

Pgina 9

DBDATE mdy2/ dmy2/ dmy4/ mdy4/ y4mdy2md/

Ex: para escrever 1 de Fevereiro de 2003 02/01/03 01/02/03 01/02/2003 02/01/2003 2003-02-01 03/02/01

DBMONEY

O INFORMIX-SQL um produto americano, como tal os valores

monetrios so

representados como dolares "$", e o indicador de casa decimal por defeito ".". Para usar outro formato nas colunas MONEY necessrio incializar a varivel DBMONEY, especificando o separador das partes inteira e decimal, e sufixo ou prefixo indicador de unidade. Por exemplo na alemanha onde se usa "Deutsch Marks", fariamos: DBMONEY=,DM export DBMONEY

assim teriamos para escrever doze mil Deutsch Marks apareceria "123.000,00DM".

DBPATH

Esta varivel de ambiente serve para indicar ao INFORMIX-SQL onde vai procurar bases de dados, forms (crans de entrada de dados), reports (relatrios), ou scripts de RDSQL.

DBPRINT

Quando se envia um report para uma impressora, este enviado para um programa que se encarrega das tarefas de gesto de impresses (por ex: lpstat no UNIX), o nome do tal programa pode ser indicado na varivel DBPRINT. Em qualquer altura se pode mudar a impressora de destino por defeito, mudando a varivel DPRINT. .P Se quizermos por exemplo enviar para a impressora "beta" com as opes "-onb", fazemos: DPRINT="lp -s -dbeta -onb" export DBPRINT

DBEDIT

Esta varivel de ambiente serve para definir o editor de texto que chamado por defeito. Por exemplo:

Manual de introduo ao SQL em Informix

Pgina 10

DBEDIT=vi export DBEDIT

DBTEMP

Por defeito o UNIX cria os ficheiros temporrios no directrio "/tmp". Para indicar outro directrio deve colocar-se o nome deste na varivel DBTEMP.

DBDELIMETER

Esta varivel serve para definir os delimitadores, dos campos usados pelos

comandos LOAD e UNLOAD. No caso desta varivel no estar definida o INFORMIX assume o caracter "|".

DBMENU Esta varivel define qual o menu que executado quando se escolhe a opo "USER-MENU". Se no for inicializada executado o menu MAIN. DBMENU=main export DBMENU

SQLEXEC

Esta varivel indica qual o programa de acesso base de dados (database engine ou

database mechanism) usado. Esta varivel s pode ser usada quando se utilize o INFORMIXTURBO ou ON-LINE. Se na mesma mquina coexistirem os dois mtodos de acesso base de dados deve inicializar-se esta varivel com: SQLEXEC=sqlexec export SQLEXEC

para o motor standard (SE) e SQLEXEC=sqlturbo export SQLEXEC

para a verso on-line

Manual de introduo ao SQL em Informix

Pgina 11

2. RDSQL

2.1.Acedendo ao RDSQL

Seleccionando a opo Query-language do Main Menu pode inserir e correr instrues de RDSQL, isoladas ou em sequncia sendo neste caso separadas pelo ";". Depois de seleccionar a opo Query-language aparecer o ecran CHOOSE DATABASE indicando que, neste momento, est disponvel a base de dados STORES. Para seleccionar a base de dados STORES digite o nome respectivo e pressione RETURN, ou ento selecione a base de dados, deslocando o cursor ao longo da lista das bases de dados e pressione RETURN. Aparecer ento o ecran de menu RDSQL.

2.2. As Opes do RDSQL


O menu do RDSQL tem as seguintes opes : New Permite introduzir um novo conjunto de instrues, atravs do editor do RDSQL. Ao escolher esta opo o conjunto anterior de instrues perder-se-, se no for salvaguardado pela opo SAVE.

Run

Executa o conjunto actual de instrues.

Modify

Mostra o editor do RDSQL com o conjunto actual de instrues e permite que se corrijam erros de sintaxe, faam alteraes e se acrescentem instrues.

Use-editor Permite editar as instrues num editor do sistema em vez do editor do RDSQL.

Output

Envia os resultados da execuo do conjunto actual de instrues para uma impressora, para um ficheiro do sistema ou para outro programa.

Manual de introduo ao SQL em Informix

Pgina 12

Choose

Mostra uma lista dos ficheiros com comandos de RDSQL e permite selecionar um deles e torn-lo no conjunto actual de instrues.

Save

Salvaguarda o conjunto actual de instrues num ficheiro de comandos. O RDSQL acrescenta a extenso ".sql" ao nome dado ao ficheiro.

Info

Mostra informao sobre uma tabela da base de dados actual.

Drop

Apaga um ficheiro de comandos RDSQL.

Exit

Volta ao Main Menu.

2.3. Regras para escrever instrues de RDSQL.

O RDSQL intrepreta qualquer sucesso de espaos tabs ou NEWLINES como um nico espao. O encadeamento das instrues e/ou de parte das instrues arbitrrio. Assim pode dar s instrues a forma que achar mais legvel. Pode incluir comentrios que sero ignorados pelo RDSQL desde que estejam entre chavetas "{...}".

2.4. Como Usar Bases de Dados e Tabelas.

As aces sobre bases de dados e tabelas podem ser executadas de 2 formas diferentes: Utilizando instrues SQL, na opo Query-language do main Menu. Utilizando as opes Database e Table para trabalhar bases de dados e tabelas, respectivamente. Neste captulo iremos usar a primeira forma (instrues SQL). As opes Database e Table executam algumas das funes disponveis no RDSQL e o seu uso directo.

2.5. Criao duma Base de Dados - CREATE DATABASE.

Como exerccio vamos criar a base de dados TESTE. Selecione a opo Query-language do Main Menu. -> Aparece-lhe o ecran CHOOSE DATABASE.

Manual de introduo ao SQL em Informix

Pgina 13

Saia do ecran CHOOSE DATABASE pressionando a tecla DEL. -> Aparece-lhe o ecran de menu RDSQL.

Selecione a opo New. Aparece-lhe o ecran de entrada de texto NEW.

Digite a instruo : create database teste

Pressione ESC -> Volta ao menu RDSQL.

Selecione a opo Run -> Criou a base de dados teste e tornou-a na base de dados actual, escrevendo o seu nome na terceira linha do ecran de menu RDSQL.

2.5.1. Seleco da Base de Dados Actual - DATABASE.

Vamos selecionar STORES como a base de dados actual. Em vez da opo New selecione a opo User-edit para introduzir a instruo RDSQL atravs do editor com que costuma trabalhar habitualmente.

Insira a instruo: database stores

Grave o ficheiro e saia do editor. -> Aparece-lhe o menu RDSQL com o comando gravado pelo editor na seco de texto do ecran.

Selecione a opo Run -> Tornou STORES na base de dados actual escrevendo o seu nome na terceira linha do ecran de menu RDSQL.

2.5.2. Criao duma Tabela - CREATE TABLE

Para criar uma tabela necessrio utilizar a instruo

create database

e especificar o nome da

tabela e o nome e o tipo de dados de cada coluna. Os tipos de dados permitidos pelo RDSQL so os seguintes:

CHAR(n) SMALLINT

Alfanumrico de comprimento n. Numrico inteiro (binrio) de -32767 a +32767.

Manual de introduo ao SQL em Informix

Pgina 14

INTEGER DECIMAL(m,n) SMALLFLOAT FLOAT MONEY(m,n)

Numrico inteiro (binrio) de -2 147 483 647 a +2 147 486 647. Numrico decimal de comprimento m e n casa decimais. Numrico com vrgula flutuante Numrico com vrgula flutuante de dupla palavra Numrico decimal com cifro ($) no incio, de comprimento m e com n casas decimais

SERIAL(n)

Numrico inteiro sequncial gerado automaticamente pelo RDSQL. A numerao

comea no inteiro n. DATE Formato de data. Existe a possibilidade de seleccionar vrios formatos de datas. O formato que iremos utilizar ser: MM-DD-AAAA. DATETIME INTERVAL VARCHAR (m,n) indefinido BYTE
*

Ponto temporal com preciso definida. Intervalo de tempo com preciso definida. Alfanumrico de tamanho varivel TEXT
*

Texto

de

comprimento

Qualquer formato binrio.

Ao definir as colunas ainda necessrio especificar se a coluna de preenchimento obrigatrio acrescentando NOT NULL a seguir definio do tipo de dados da coluna.

S INFORMIX On Line

Manual de introduo ao SQL em Informix

Pgina 15

DIAGRAMA DE DECISO PARA ESCOLHA DOS TIPO DE DADOS


Os dados so numricos?

sim

no
Os nmeros so inteiros ?

sim

no sim

Os nmeros so todos entre -32767 e 32767 ?

no
Os nmeros so todos entre -2 bilies e 2 bilies ?

sim

SMALLINT

no
Ns. fraccionrios com n fixo de casas

INTEGER

sim

DECIMAL(p,0) DECIMAL(p,s)

no
Mx. de 8 algarismos significativos ?

sim

no
Mx. de 16 algarimos significativos ?

sim

SMALLFOAT

DECIMAL(p)
Os dados so cronolgicos?

FLOAT

sim

no
um intervalo de tempo ou um instante ?

intervalo INTERVAL

Preciso para o dia mais prximo ?

sim

no DATE
Contm caracteres acentuados ?

sim

DATETIME

no
Comprimento fixo ou pouco varivel ?

sim

no NCHAR(n) NVARCHAR(m,r)
Caracteres ASCII ?

sim
Comprimento fixo ou pouco varivel ?

no

sim sim

no sim

Com primento entre 32, 511 bytes ?

BYTE

O comprimento excede os 255 bytes ?

no CHAR(n) TEXT

no CHARACTER VARYNG(m,r) ou VARCHAR(m,r)

Manual de introduo ao SQL em Informix

Pgina 16

Noo de NULL.Quando no existe nenhum valor associado a uma coluna diz-se que essa coluna contm o valor NULL. Note que NULL diferente de zero ou de espao. Vamos agora criar a tabela CLIENTES Digite a seguinte instruo: create table clientes ( num_clie serial(101), nome char(20), morada char(20), concelho char(10), cod_post smallint, telef integer, credito decimal(15,2), data_adm date ) e execute-a -> Criou a tabela CLIENTES.

2.5.3. Informaes sobre uma tabela - INFO

Para obter informaes sobre uma tabela pode-se utilizar a instruo INFO ou seleccionar a opo INFO do menu RDSQL. Esta ltima a mais prtica e ser a que iremos usar. Selecione a opo Info. -> Aparece o ecran INFO FOR TABLE.

Selecione a tabela clientes. -> Aparece o menu INFO - clientes.

Selecione a opo columns. -> Aparece uma lista, com uma linha por cada coluna da tabela CLIENTES, contendo o nome da coluna, o tipo de dados e a indicao da aceitao de NULL por essa coluna.

2.5.4. Alteraes ao Formato das Tabelas - ALTER TABLE, RENAME TABLE, RENAME COLUMN

Imagine que pretendia alterar, na tabela clientes, a coluna NOME para NOT NULL, a coluna COD_POST para tipo de dados alfanumrico, suprimir a coluna CREDITO e acrescentar uma coluna SITUACAO com tipo de dados alfanumrico digite o seguinte query:

Manual de introduo ao SQL em Informix

Pgina 17

alter table clientes modify (nome char(20) not null, cod_post char(6)); alter table clientes drop (credito); alter table cliente add (situacao char(10) before data_adm) e execute-a, verificando se as alteraes foram executadas utilizando a opo Info. Apesar da tabela clientes j possuir as colunas correctamente descritas pretende-se alterar o nome da coluna CONCELHO para LOCALIDADE e mudar o nome da tabela para CLIENT-A. Digite as instrues : rename column clientes.concelho to localidade; rename table clientes to client-a

e execute-as, verificando se as alteraes foram executadas utilizando a opo Info.

2.5.5. Supresso duma Tabela - DROP TABLE.

Vamos suprimir a tabela CLIENT-A. Digite o query : drop table client-a e execute-o confirmando com a opo Info.

2.5.6. Supresso duma Base de Dados - CLOSE DATABASE, DROP DATABASE

Antes de suprimir a base de dados TESTE tem de se fechar os seus ficheiros com a instruo CLOSE DATABASE. Digite o query: close database; drop database teste

e execute-o. -> Suprimiu a base de dados teste.

2.6. Manipulao de Dados

As instrues de RDSQL mais utilizadas na explorao duma base de dados so aquelas que manipulam os dados, quer dizer as que permitem consultar, inserir, apagar ou actualizar as linhas das tabelas. Manual de introduo ao SQL em Informix Pgina 18

2.6.1. Como Consultar uma Tabela - SELECT

A instruo SELECT a mais comum, pois utilizada para selecionar uma ou mais linhas de uma ou mais tabelas, sendo usada na execuo de qualquer relatrio. O formato da instruo SELECT com as suas clusulas mais comuns o seguinte: SELECT FROM WHERE ORDER BY Um exemplo: SELECT FROM WHERE ORDER BY order_num, stock_num, quantity items item_num=3 manu_code lista de colunas lista de tabelas condies lista de colunas

Iremos ver medida que executarmos os possibilidades da instruo e das suas clusulas.

exerccios seguintes qual o significado e quais as

2.6.1.1. Gravao e Recuperao dum query.


s vezes pode pretender iniciar um novo query mas salvaguardar o query actual para usar mais tarde. O RDSQL permite gravar o query actual num ficheiro com o nome sua escolha ao qual o RDSQL acrescentar a extenso ".sql". Vejamos o seguinte exemplo: Selecione o menu RDSQL e digite o query do exemplo anterior. Selecione a opo Save. -> Aparece o ecran SAVE. Introduza o nome que pretende dar ao ficheiro onde ficar guardado o query. -> Grava o ficheiro e retorna ao menu RDSQL. Para recuperar o query: Selecione a opo Choose do menu RDSQL. -> Aparece o menu CHOOSE com a lista dos ficheiros de comandos disponiveis. Selecione o nome do ficheiro que gravou no exerccio anterior. -> Retorna ao menu RDSQL com o query guardado no ficheiro selecionado pronto para ser executado. Para apagar o ficheiro de comando:

Manual de introduo ao SQL em Informix

Pgina 19

Selecione a opo Drop do menu RDSQL. -> Aparece o menu DROP COMMAND FILE com a lista dos ficheiros de comandos disponiveis. Selecione o nome do ficheiro que pretende apagar -> Apaga o ficheiro de comandos selecionado e retorna ao menu RDSQL.

2.6.1.2. Seleco de Algumas Colunas duma Tabela


Para selecionar algumas colunas, use SELECT, seguido dos nomes das colunas que pretende, ordenadas da esquerda para a direita, separadas por vrgulas. para especificar a tabela use FROM seguido do nome da tabela. Introduza a seguinte instruo: SELECT FROM description, stock_num, manu_code stock

Obtendo este relatrio: description baseball gloves baseball gloves baseball gloves baseball baseball bat football football tennis racquet tennis racquet tennis racquet tennis ball tennis ball basketball volleyball volleyball net stock_num 1 1 1 2 3 4 4 5 5 5 6 6 7 8 9 num manu_code HRO HSK SMT HRO HSK HSK HRO NRG SMT ANZ SMT ANZ HRO ANZ ANZ

2.6.1.3. Seleco da Totalidade das Colunas duma Tabela


Para obter a totalidade das colunas, use SELECT seguido de * (asterisco), depois FROM e o nome da tabela. As colunas aparecero, da esquerda para a direita, na mesma ordem com que se definiu a tabela. Introduza a seguinte instruo: SELECT FROM * stock

Obtendo este relatrio:

Manual de introduo ao SQL em Informix

Pgina 20

stock_num 1 1 1 2 3 4 4 5 5 5 6 6 7 8 9

manu_code HRO HSK SMT HRO HSK HSK HRO NRG SMT ANZ SMT ANZ HRO ANZ ANZ

description baseball gloves baseball gloves baseball gloves baseball baseball bat football football tennis racquet tennis racquet tennis racquet tennis ball tennis ball basketball volleyball volleyball net

unit_price $250.00 $800.00 $450.00 $126.00 $240.00 $960.00 $480.00 $28.00 $25.00 $19.80 $36.00 $48.00 $600.00 $840.00 $20.00

unit case case case case case case case each each each case case case case each

unit_descr 10 gloves/case 10 gloves/cas 10 gloves/cas 24/case 12/case 24/case 24/case each each each 24 cans/case 24 cans/case 24/case 24/case each

2.6.1.4. Eliminao de linhas duplicadas


Se escrever DISTINCT logo a seguir palavra SELECT elimina as linhas duplicadas do resultado. Introduza a seguinte instruo: SELECT DISTINCT FROM WHERE Obtendo este relatrio: unit_descr 10 gloves/case 24/case 12/case 24 cans/case resultado mostra-nos as vrias embalagens do tipo "case". Ainda que a mesma embalagem seja usada para mais do que um artigo s aparece uma vez no resultado. unit_descr stock unit='case

2.6.1.5. Seleces por Condies.


Muitas vezes no se pretende obter todas as linhas duma tabela. Por exemplo pode querer saber quais so os artigos que tenham stock_num = 5 (raquetes de tnis). Introduza a seguinte instruo: SELECT FROM WHERE * stock stock_num=5

Obtendo este relatrio: Manual de introduo ao SQL em Informix Pgina 21

stock_num 5 5 5

manu_code ANZ NRG SMT

description tennis racquet tennis racquet tennis racquet

unit_price $19.80 $28.00 $25.00

unit each each each

unit_descr each each each

O resultado anterior mostra todos os artigos da tabela stock que tenham stock_num igual a 5. Se existisse s uma linha nestas condies s apareceria essa linha. Se nenhuma das condies da clusula WHERE fosse satisfeita pelas linhas da tabela obter-se-ia no ecran um resultado vazio.

2.6.1.6. Seleco de Linhas Usando Dados Alfanumricos.


Para selecionar linhas duma tabela usando condies sobre dados alfanumricos, basta colocar esses dados entre " " " (plicas). Introduza e execute o query: SELECT FROM WHERE customer_num, company, address1, address2 customer city="Redwood City"

Obtendo o resultado: customer_num 104 108 110 114 117 company Play Ball! Quinn's Sports AA Athletics Sporting Place Kids Korner address1 East Shopping Cntr. 587 Alvarado 520 Topaz Way 947 Waverly Place 850 Lytton Court address2 422 Bay Road

Repare na coluna address2. Esta coluna no possui valores em 4 linhas. Isto quer dizer que os valores da coluna nessas linhas NULL (e no espaos como veremos a seguir).

2.6.1.7. Seleco de Linhas com Nulls.


Suponhamos que pretendemos a mesma informao do query anterior, mas neste caso para a lista dos clientes (customer) que tenham address2 com valor NULL. Introduza e execute o query:

SELECT FROM WHERE

customer_num, company, address1, address2 customer adress2 is nulls

Manual de introduo ao SQL em Informix

Pgina 22

Obtendo o resultado: customer_num 101 102 105 106 107 108 110 111 112 113 114 115 116 117 118 company All Sports Supplies Sports Spot Los Altos Sports Watson & Son Athletic Supplies Quinn's Sports AA Athletics Sports Center Runners & Others Sportstown Sporting Place Gold Medal Sports Olympic City Kids Korner Blue Ribbon Sports address1 213 Erstwild Court 785 Geary St 1899 La Loma Drive 1143 Carver Place 41 Jordan Avenue 587 Alvarado 520 Topaz Way 3199 Sterling Court 234 Wyandotte Way 654 Oak Grove 947 Waverly Place 776 Gary Avenue 1104 Spinosa Drive 850 Lytton Court 5427 College address2

Observe que na clusula WHERE escreve-se " is null " e no " = null " que incorrecto. Para selecionar linhas sem Nulls escreva " is not null".

2.6.1.8. Seleco de Linhas Usando Desigualdades


At agora s selecionmos linhas usando igualdades na clusula WHERE. Tambm podemos faz-lo usando qualquer tipo de comparao, usando os seguintes simbolos: != ou <> diferente > maior >= maior ou igual < menor <= menor ou igual

Vamos selecionar os artigos que tm um valor unitrio inferior a 100. SELECT FROM WHERE * stock unit_price < 100

Obtem-se o resultado: stock_num 5 5 menu_code NRG SMT description tennis racquet tennis racquet unit_price $28.00 $25.00 unit each each unit_descr each each

Manual de introduo ao SQL em Informix

Pgina 23

5 6 6 9

ANZ SMT ANZ ANZ

tennis racquet tennis ball tennis ball volleyball net

$19.80 $36.00 $48.00 $20.00

each case case each

each 24 cans/case 24 cans/case each

Se quiser saber quais os artigos que tm preo unitrio entre 100 e 200 inclusive use o operador BETWEEN. SELECT * FROM stock WHERE unit_price BETEWEN 100 AND 200 Obtendo o resultado: stock_num 1 2 3 manu_code HRO HRO HSK description baseball gloves baseball baseball bat unit_price $250.00 $126.00 $240.00 unit case case case unit_descr 10 gloves/case 24/case 12/case

2.6.1.9. Seleco de Linhas usando condies pela Negativa


Pode usar a negao de qualquer condio escrevendo NOT antes desta desta. Para clarificar a que condio o NOT se aplica, use parntesis. Por exemplo:

NOT A AND B OR C significa ((NOT A) AND B) OR C e se pretender condies diferentes tem ento de usar parntises obrigatriamente. Com os operadores maior que, menor que ou igual, NOT deve preceder a condio. Por exemplo deve usar: WHERE NOT UNIT_PRICE < 100 e no WHERE UNIT-PRICE NOT < 100 S nos casos que se enumeram a seguir que NOT no precede a condio: NOT NULL; NOT LIKE; NOT IN; NOT BETWEEN. Exemplos: Este query seleciona todos os artigos cujo preo unitrio no esteja compreendido entre 100 e 300. select * from stock where unit_price not between 100 and 300 obtendo-se o relatrio:

Manual de introduo ao SQL em Informix

Pgina 24

1 1 4 4 5 5 5 6 6 7 8 9

HSK SMT HSK HRO NRG SMT ANZ SMT ANZ HRO ANZ ANZ

baseball gloves baseball gloves football football tennis racquet tennis racquet tennis racquet tennis ball tennis ball basketball volleyball volleyball net

$800.00 $450.00 $960.00 $480.00 $28.00 $25.00 $19.80 $36.00 $48.00 $600.00 $840.00 $20.00

case case case case each each each case case case case each

10 gloves/case 10 gloves/case 24/case 24/case each each each 24 cans/case 24 cans/case 24/case 24/case each

O query seguinte seleciona os artigos cujo preo unitrio no seja inferior a 400 e que no pertenam categoria de futebol. select from where * stock not unit_price < 400 and not description = 'football'

Obtendo-se o relatrio:

1 1 7 8

HSK SMT HRO ANZ

basebal gloves basebal gloves basketball volleyball

$800.00 $450.00 $600.00 $840.00

case case case case

10 gloves/case 10 gloves/case 24/case 24/case

2.6.1.10. Seleco com linhas Ordenadas


Para ordenar o resultado de um query por determinadas colunas, use ORDER BY, seguido dos nomes das colunas que controlam a ordenao. As linhas do resultado aparecero ordenadas por ordem ascendente pela coluna que especificou com ORDER BY (por defeito assume por ordem ascendente). Se pretender que as linhas do resultado sejam ordenadas por ordem descendente escreva ORDER BY -nome da coluna- DESC.

A primeira coluna a seguir a ORDER BY ser a primeira a ser ordenada. A segunda coluna da clusula ORDER BY ser ordenada dentro da primeira e assim por diante. Por exemplo:

Manual de introduo ao SQL em Informix

Pgina 25

select order_date, customer_num, from orders where paid_date is not null order by order_date desc,customer_num obtendo-se o relatrio:

order_num

06/06/1984 06/06/1984 06/05/1984 06/05/1984 06/05/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/01/1984 06/01/1984

104 110 104 106 115 104 110 111 116 101 104

1013 1015 1011 1014 1010 1003 1008 1009 1005 1002 1001

Note que a coluna ORDER_DATE est ordenada por ordem descendente e que dentro desta CUSTOMER_NUM est ordenada por ordem ascendente.

2.6.1.11. Seleco de Linhas por Partes de Valores


Para selecionar dados de que s se conhea parte do seu valor, use LIKE numa clusula WHERE com um smbolo para os dados desconhecidos. "%" Significa "conjunto de zero ou mais caracteres" "_" Significa "qualquer caracter". Use mais do que um destes smbolos em sequncia para representar o nmero exacto de caracteres que faltam. As instrues que se seguem querem dizer, "Mostre todos os artigos cuja descrio inclua baseball". select from where stock_num, manu_code, description stock description like 'baseball%'

obtendo-se o relatrio:

1 1 1 2

HRO HSK SMT HRO

baseball gloves baseball gloves baseball gloves baseball

Manual de introduo ao SQL em Informix

Pgina 26

HSK

baseball bat tenha

AS instrues que se seguem querem dizer, "Mostre todos os artigos cuja descrio exactamente 10 caracteres e termine em ball". select from where stock_num, manu_code, description stock description like '______ball'

obtendo-se o relatrio:

7 8

HRO ANZ

basketball volleyball

Pode usar "%" mais do que uma vez numa expresso. Por exemplo : select stock_num, manu_code, description from stock where description like '%o%b%' Encontrar todos os artigos cuja descrio inclua as letras "o" e "b" e por esta ordem.

4 4 8 9

HSK HRO ANZ ANZ

football football volleyball volleyball net

Pode usar "%" e "_" juntos numa expresso. Por exemplo: select stock_num, manu_code, description from stock where description like '___k%' Encontrar todos os artigos cuja descrio inclua a letra "k" na quarta posio.

HRO

basketball

Pode usar NOT antes de LIKE para especificar os valores que quer excluir. Por exemplo : select from stock_num, manu_code, description stock

Manual de introduo ao SQL em Informix

Pgina 27

where description not like '%ball%' Encontrar todos os artigos cuja descrio no inclua "ball".

5 5 5

NRG SMT ANZ

tennis racquet tennis racquet tennis racquet

2.6.1.12. Seleco de Linhas com Condies Compostas


Pode utilizar condies compostas ligando as expresses com AND, OR e IN. Usando AND O query seguinte seleciona as encomendas e respectivos clientes do primeiro semestre de 1984 e que ainda no foram pagas.

select from where

order_num,order_date,customer_num, ship_instruct orders order_date between '01/01/1984' and '06/30/1984' and paid_date is null

obtendo-se o relatrio:

1004 1006 1007 1012 Usando OR

06/04/1984 06/04/1984 06/04/1984 06/05/1984

106 112 117 117

ring bell twice after 10 am

O query seguinte selecciona as encomendas e respectivos clientes que tenham peso superior a 20 ou montante de expedio superior a 15.

select from where

order_num, order_date, customer_num, ship_weight, ship_charge orders ship_weight > 20 or ship_charge > 15 Pgina 28

Manual de introduo ao SQL em Informix

obtendo-se o relatrio:

1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1012 1013 1014 1015

06/01/1984 06/01/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/05/1984 06/05/1984 06/06/1984 06/05/1984 06/06/1984

104 101 104 106 116 112 117 110 111 115 117 104 106 110

20.40 50.60 35.60 95.80 80.80 70.80 125.90 45.60 20.40 40.60 70.80 60.80 40.60 20.60

$10.00 $15.30 $10.80 $19.20 $16.20 $14.20 $25.20 $13.80 $10.00 $12.30 $14.20 $12.20 $12.30 $6.30

Usando IN As vezes mais prtico usar a instruo IN em vez de mltiplas instrues OR para procurar vrios valores duma coluna. Por exemplo : em vez de: order_num, order_date, customer_num, ship_instruct from orders where customer_num = 104 or customer_num = 106 or customer_num = 110 use: select order_num, order_date, customer_num, ship_instruct from orders where customer_num in (104, 106, 110) obtendo-se o relatrio: select

1001 1003 1004 1008 1011 1013

06/01/1984 06/04/1984 06/04/1984 06/04/1984 06/05/1984 06/06/1984

104 104 106 110 104 104

ups via ups ring bell twice closed Monday ups via ups Pgina 29

Manual de introduo ao SQL em Informix

1014 1015

06/05/1984 06/06/1984

106 110

ring bell, kick door loudly closed Mon

Quando IN for utilizado devem ser especificados, pelo menos, dois valores dentro dos parntesis. Por exemplo, WHERE CUSTOMER_NUM IN (104) incorrecto. Neste caso ter de escrever WHERE CUSTOMER_NUM = 104. Tambm pode especificar os valores que pretender excluir usando IN com NOT. Por exemplo WHERE CUSTOMER_NUM NOT IN (104, 106,10).

Mais Alguns Exemplos Se usar AND e OR utilize parentesis para claro o agrupamento das suas comparaes. As condies dentro dos parentesis sero executadas primeiro. Caso no use parentesis lembre-se que todas as condies ligadas por AND sero executadas primeiro, e s depois sero executadas as condies ligadas por OR. Por exemplo o query: select order_num, order_date, customer_num, ship_weight, ship_charge from orders where (customer_num > 104 and ship_weight > 20) or ship_charge > 15 produzir o mesmo resultado com ou sem parentesis porque AND calculado antes de OR:

1002 1004 1005 1006 1007 1008 1009 1010 1012 1014 1015

06/01/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/04/1984 06/05/1984 06/05/1984 06/05/1984 06/06/1984

101 106 116 112 117 110 111 115 117 106 110

50.60 95.80 80.80 70.80 125.90 45.60 20.40 40.60 70.80 40.60 20.60

$15.30 $19.20 $16.20 $14.20 $25.20 $13.80 $10.00 $12.30 $14.20 $12.30 $6.30

Mas se movermos os parentesis: select from order_num, order_date, customer_num, ship_weight, ship_charge orders

Manual de introduo ao SQL em Informix

Pgina 30

where

customer_num > 104 and (ship_weight > 20 or ship_charge > 15)

Obtendo-se o resultado:

1004 1014 1008 1015 1009 1006 1010 1005 1007 1012

06/04/1984 06/05/1984 06/04/1984 06/06/1984 06/04/1984 06/04/1984 06/05/1984 06/04/1984 06/04/1984 06/05/1984

106 106 110 110 111 112 115 116 117 117

95.80 40.60 45.60 20.60 20.40 70.80 40.60 80.80 125.90 70.80

$19.20 $12.30 $13.80 $6.30 $10.00 $14.20 $12.30 $16.20 $25.20 $14.20

Se for necessrio tambm se podem usar vrios nveis de parentesis.

2.6.1.13. Usando Valores Calculados


Pode escrever operaes aritmticas com qualquer um dos seguintes operadores: + * / Este query select stock_num, from items where order_num = 1005 manu_code, (total_price/quantity) adio subtraco multiplicao diviso

produz o seguinte relatrio

5 5 6 6

NRG ANZ SMT ANZ

$28.00 $19.80 $36.00 $48.00

A expresso TOTAL_PRICE/QUANTITY calcula o "preo unitrio".

Manual de introduo ao SQL em Informix

Pgina 31

Algumas Notas. EXPRESSION: O RDSQL no sabe qual o nome a dar coluna calculada. Por isso chama-lhe EXPRESSION.

NULLS: O resultado de qualquer operao aritmtica sobre uma coluna com uma ou vrias linhas com o valor NULL ser NULL para essa(s) linha(s). (Lembre-se que NULL no zero. NULL significa que RDSQL no conhece nenhum valor para essa coluna e essa linha. Logo o resultado duma operao sobre um valor desconhecido ainda um valor desconhecido.)

2.6.1.14. Seleco Por valores Calculados


Para selecionar dados atravs de valores calculados use expresses aritmticas na clusula WHERE. Por exemplo: select from where stock_num, manu_code, (total_price/quantity) items order_num = 1005 and total_price/quantity > 30

produz o seguinte relatrio stock_num 6 6 manu_code SMT ANZ (expression) $36.00 $48.00

Neste caso selecionmos os preos unitrios superiores a 30 da encomenda nmero 1005.

2.6.1.15. Ordenao de Linhas por Valores Calculados


Para selecionar linhas ordenadas por valores calculados refira-se coluna do valor calculado pelo seu nmero de coluna. Por exemplo: select from where stock_num, manu_code, (total_price/quantity) items order_num = 1005 order by 3

obtendo o seguinte relatrio stock_num 5 Manual de introduo ao SQL em Informix manu_code ANZ (expression) $19.80 Pgina 32

5 6 6

NRG SMT ANZ

$28.00 $36.00 $48.00

ORDER BY 3 significa "ordenado pela terceira coluna specificada na escreva ORDER BY -espresso aritmtica- pois no funciona).

clusula

SELECT".(No

NOTA: Os valores NULL aparecero nas ascendente ou descendente, respectivamente.

ltimas ou primeiras linhas conforme a ordenao seja

2.6.2. Insero de Linhas num Tabela - INSERT

At ao fim deste captulo a maior parte dos exerccios sero feitos sobre a tabela FABRICANTE que uma rplica da tabela MANUFACT.

Verifique se a tabela j est criada. Se no estiver crie-a.

2.6.2.1. Insero de uma Linha numa Tabela


Para inserir uma Linha na Tabela FABRICANTE introduza a seguinte instruo: insert into fabricante (manu_code, manu_name) values ('ZZZ', 'Zacarias')

Para confirmar que esta linha foi inserida selecione a totalidade das linhas e colunas da tabela, devendo obter um resultado semelhante ao que se segue: manu_code ZZZ manu_name Zacarias

NOTA: Num caso como este em que estamos a inserir valores para todas as colunas da tabela no obrigatrio preencher os nomes das colunas a seguir ao nome da tabela. Experimente inserir mais uma linha na tabela, sem escrever os nomes das colunas.

2.6.2.2. Insero de Valores numa Coluna duma Tabela


Se pretender inserir valores nalgumas colunas da tabela especifique quais as colunas e os respectivos valores que pretende inserir. Por exemplo: Manual de introduo ao SQL em Informix Pgina 33

insert into fabricante (manu_code) values ('ZAP')

Para confirmar que esta linha foi inserida selecione a totalidade das linhas e colunas da tabela, devendo obter um resultado semelhante ao que se segue: manu_code ZZZ ZAP manu_name Zacarias

NOTA: As colunas que no foram especificadas recebero o valor NULL.

2.6.2.3. Como Copiar Linhas duma Tabela para Outra


Suponha que pretende inserir na tabela FABRICANTE algumas das linhas de MANUFACT. A instruo seguinte copia de MANUFACT as linhas cujo MANU_CODE diferente de ANZ e insere-as em FABRICANTE. insert select from where into fabricante * manufact manu_code <> NZ'

Para confirmar que estas linhas foram inseridas selecione a totalidade das linhas e colunas da tabela, devendo obter um resultado semelhante ao que se segue: manu_code ZZZ ZAP SMT NRG HSK HRO manu_name Zacarias Smith Norge Husky Hero

NOTA: A uma instruo SQL contida noutra instruo de SQL chama-se um SUBQUERY (no nosso caso INSERT contm SELECT). No captulo 4 "Aprofundamento das trataremos dos subqueries mais em pormenor. possibildades do SELECT"

Manual de introduo ao SQL em Informix

Pgina 34

2.6.3. Alterao dos Valores duma Tabela - UPDATE

O query seguinte modifica o valor da coluna MANU_NAME para 'Zacar', na linha com MANU_CODE igual a ZZZ. update fabricante set manu_name = 'Zacar' where manu_code = 'ZZZ' Para confirmar que estas linhas foram alteradas selecione a totalidade das linhas e colunas da tabela, devendo obter um resultado semelhante ao que se segue: manu_code ZZZ ZAP SMT NRG HSK HRO manu_name Zacar Smith Norge Husky Hero

A instruo UPDATE muito verstil. Suponha que pretende aumentar em 10% os artigos com STOCK_NUM igual a 4, na tabela STOCK. Introduza e execute o query: update stock set unit_price = unit_price where stock_num = 4

1.1

Para confirmar que estas linhas foram alteradas selecione a totalidade das linhas e colunas da tabela, e compare o resultado que se segue com o obtido no captulo 2.3. stock_num 1 1 1 2 3 4 4 5 5 5 manu_code HRO HSK SMT HRO HSK HSK HRO NRG SMT ANZ description baseball gloves baseball gloves baseball gloves baseball baseball bat football football tennis racquet tennis racquet tennis racquet unit_price $250.00 $800.00 $450.00 $126.00 $240.00 $1056.00 $528.00 $28.00 $25.00 $19.80 unit case case case case case case case each each each unit_descr 10 gloves/case 10 gloves/case 10 gloves/case 24/case 12/case 24/case 24/case each each each Pgina 35

Manual de introduo ao SQL em Informix

6 6 7 8 9

SMT ANZ HRO ANZ ANZ

tennis ball tennis ball basketball volleyball volleyball net

$36.00 $48.00 $600.00 $840.00 $20.00

case case case case each

24 cans/case 24 cans/case 24/case 24/case each

NOTA: Para alterar vrias colunas basta introduzi-las na clusula SET, separadas por vrgulas.

2.6.4.Supresso de Linhas duma Tabela - DELETE

Para apagar uma ou mais linhas duma tabela use a instruo DELETE. Por exemplo: delete from fabricante where manu_code = 'ZZZ' or manu_code = 'ZAP'

Para confirmar que estas linhas foram apagadas selecione a totalidade das linhas e colunas da tabela, e compare o resultado que se segue com o obtido no captulo 2.3.2. manu_code SMT NRG HSK HRO manu_name Smith Norge Husky Hero

NOTA: Ao usar a instruo DELETE tem de ter muita ateno com a clusula WHERE, pois pode apagar linhas da tabela que no quisesse ou at pode apagar todas as linhas da tabela se se esquecer de usar a clausula WHERE.

2.7. Indices

Quando nas Bases de Dados as tabelas tm um nmero de linhas muito elevado e/ou possuem queries muito complexos o tempo de resposta degrada-se muito. A forma de melhorar os tempos de resposta passa pela criao de indices sobre colunas criteriosamente escolhidas.

So dois os grandes objectivos ao criar indices sobre colunas duma tabela:

Manual de introduo ao SQL em Informix

Pgina 36

Aumentar a velocidade da ordenao das linhas da tabela. Optimizar a execuo dos queries.

Como quando se alteram as linhas duma tabela tambm se alteram os indices da tabela, os processos de alterao dum grande nmero de linhas podem tornar-se muito pesados e portanto demorados. No entanto nos casos em que os dados so alterados e inseridos interactivamente, isto linha a linha, este problema normalmente no se pe.

2.7.1. Criao dum indice - CREATE INDEX

Suponha que pretende criar na tabela ITEMS, um indice composto sobre as colunas ITEM_NUM e ORDER_NUM e que no pretende entradas duplicadas.

Introduza o query: create distinct index ind3_ite on items (item_num, order_num)

e execute-o. Se pretender confirmar que o indice foi criado utilize a opo Info do menu RDSQL, e a seguir selecione a opo Indexes.

2.7.2. Como Retirar um Indice - DROP INDEX

Suponha que o ndice criado anteriormente j no necessrio e que deve ser removido. Introduza o query: drop index ind3_ite

e execute-o. Se pretender confirmar que o indice foi retirado utilize a opo Info do menu RDSQL, e a seguir selecione a opo Indexes.

Manual de introduo ao SQL em Informix

Pgina 37

2.7.3. Indices Cluster - ALTER INDEX

Como tanto em UNIX como em DOS os dados so extrados do disco em blocos, quanto maior for o nmero de linhas da tabela que estejam fisicamente no mesmo bloco e ordem do indice, mais rpido ser o processo de pesquisa pelo indice. possivel, pelo menos temporriamente, ter uma tabela com ordenao fsica igual ordenao dos indices. A este processo chama-se CLUSTERING. Para obter um indice cluster pode cri-lo com a clusula CLUSTER (CREATE INDEX CLUSTER nome-indice), ou ento se o indice j existir, alter-lo para cluster com a instruo ALTER INDEX TO CLUSTER. medida que so alteradas ou inseridas novas linhas na tabela o indice perde o seu estado de cluster. Quando precisar de novo do indice cluster volte a introduzir a instruo ALTER INDEX TO CLUSTER. Como uma tabela s pode ter uma ordem fsica s se pode ter um indice cluster de cada vez. Vejamos os exemplos seguintes: Para tornar cluster o indice ST_MAN_IX j existente da tabela ITEMS introduza o query: alter index st_man_ix to cluster simultneamente na mesma

Se se pretender ordenar fisicamente a tabela por outro indice tem de se libertar o cluster do indice ST_MAN_IX da tabela ITEMS, antes de se introduzir o novo cluster. Introduza as instrues seguintes para tornar cluster o indice I_O_NUM_IX: alter index st_man_ix to not cluster; alter index i_o_num_ix to cluster

2.7.4. Alguma Estratgias de Indexao

No crie indices para tabelas com menos de 200 linhas. No crie indices sobre colunas com um pequeno nmero de valores diferentes. Nestes casos deve usar um indice cluster. Se a clusula WHERE duma instruo SELECT tem condies sobre uma nica coluna crie um indice sobre essa coluna. Se existem condies sobre vrias colunas crie um indice composto sobre as colunas consideradas.

Manual de introduo ao SQL em Informix

Pgina 38

2.8. Aprofundamento das Possibilidades do SELECT

No ponto 2.3 descreveram-se as caractersticas e possibilidades bsicas da instruo SELECT. Neste ponto iremos apresentar algumas capacidades adicionais do SELECT, nomeadamente: Funes agregadas para obter valores para um grupo de linhas, tais como a mdia dos valores duma coluna ou a soma dos valores duma coluna. Funes sobre datas que permitem manipular datas completas ou partes de datas. Especificar clusulas GROUP BY, HAVING para indicar: Como pretende que as linhas do resultado sejam agrupadas (GROUP BY). Impor uma condio que as linhas do resultado,como grupo, devem respeitar (HAVING). Operador UNION que permite combinar dois queries num s, reunindo os resultados de cada um deles. Obter resultados de duas ou mais tabelas (Join). Utilizar instrues SELECT dentro de clusulas WHERE (Subqueries). Criar uma tabela temporria que contenha o resultado dum query (clusula INTO TEMP).

2.8.1. Funes Agregadas

Uma funo agregada ou de coluna produz um nico valor para um grupo de linhas. Por exemplo suponha que pretende saber qual o artigo mais caro da tabela STOCK. select max(unit_price) from stock Obtendo como resultado: (max) $1056.00

A funo agregada MAX foi aplicada uma vez a todos os valores de UNIT_PRICE. Como resultado obteu-se uma linha e um nico valor.

O RDSQL admite as seguintes funes de coluna:

AVG

Calcula a mdia de todos os valores da coluna especificada que satisfaam a clusula WHERE. S se pode aplicar AVG a colunas numricas.

Manual de introduo ao SQL em Informix

Pgina 39

MAX

Selecciona o valor mximo contido na coluna especificada que satisfaam a clusula WHERE.

e que pertenam a linhas

MIN

Selecciona o

valor

mnimo

contido

na

coluna especificada e que pertenam a

linhas que satisfaam a clusula WHERE. COUNT SUM DISTINCT Calcula o nmero de linhas que satisfaam a clusula WHERE. Soma todos os valores da coluna que satisfaam a clusula WHERE. Pode utilizar a palavra DISTINCT imediatamente antes do nome da coluna, nas funes AVG, SUM e COUNT para que as linhas duplicadas no sejam consideradas para o resultado. Por exemplo pode querer saber quantos tipos de artigos diferentes existem na tabela stock, usando o seguinte query: select from count(distinct stock_num) stock

Obtendo o resultado: (count) 9

Pode usar mais do que uma funo de coluna numa instruo SELECT. Por exemplo se pretender saber qual o valor mdio duma encomenda e ao mesmo tempo qual foi o valor mximo introduza o query seguinte: select avg(total_price), max (total_price) from items where order_num=1003

Obtendo o resultado:

(avg) $319.67

(max) $840.00

Manual de introduo ao SQL em Informix

Pgina 40

2.8.2. Funes sobre Datas

As funes sobre datas so: DATE() DAY() MONTH() YEAR() WEEKDAY() Transforma uma expresso num valor de tipo data. Extrai duma data a parte correspondente ao dia. Extrai duma data a parte correspondente ao ms. Extrai duma data a parte correspondente ao ano. Extrai duma data um inteiro que representa o dia da semana. Este inteiro varia de 0

(domingo) a 6 (sbado).

Vejamos o exemplo seguinte, onde se aplicam algumas destas funes: select order_num, order_date, customer_num, day(order_date), paid_date from orders where paid_date > date('06/01/1984') + 30

Obtendo-se o resultado: order_num order_date 1002 06/01/1984 1008 06/04/1984 1009 06/04/1984 1014 06/05/1984

customer_num 101 110 111 106

(expression) 1 4 4 5

paid_date 07/03/1984 07/17/1984 07/21/1984 07/18/1984

2.8.2.1. Operaes Aritmticas com Datas


possvel executar adies e subtraces entre datas e perodos de tempo expressos em dias. No exemplo anterior temos na clusula WHERE a soma duma data com um perodo de tempo. Note que a adio de duas datas completas d um resultado incorrecto (experimente). J a subtrao de duas datas completas possivel e obtem-se como resultado um perodo de tempo em dias. Por exemplo o query: order_num, order_date, customer_num, (paid_date - order_date), paid_date from orders where paid_date > date('06/01/1984') + 30 select

Obtendo_se o resultado:

Manual de introduo ao SQL em Informix

Pgina 41

order_num 1002 1008 1009 1014

order_date 06/01/1984 06/04/1984 06/04/1984 06/05/1984

customer_num 101 110 111 106

(expression) 32 43 47 43

paid_date 07/03/1984 07/17/1984 07/21/1984 07/18/1984

em que temos na coluna "expression" o nmero de dias que decorreram entre a encomenda e o respectivo pagamento.

2.8.3. A Clusula GROUP BY

Quando se utilizam funes de coluna (agregadas) obtem-se como resultado um valor. Usando a clusula GROUP BY a funo aplica-se a cada um dos grupos definidos pela clusula, logo obtm-se no resultado tantos valores quanto o nmero de grupos existentes na tabela.

A clusula GROUP BY permite que se seleccionem as caractersticas de grupos de linhas em vez das linhas individualmente. Quando se especifica a clusula GROUP BY o INFORMIXSQL divide as linhas selecionadas (isto as que satisfazem a clusula WHERE) em grupos que tenham o mesmo valor numa ou mais colunas. A seguir cada grupo processado para produzir um nico resultado (normalmente aplicando uma funo de coluna). Uma ou mais colunas podem ser especificadas na

clusula GROUP BY para agrupar as linhas da tabela. As colunas seleccionadas pela instruo SELECT detero propriedades do grupo de linhas e no propriedades de linhas individuais.

Por exemplo se pretender saber qual o montante total de cada encomenda introduza e execute o seguinte query: select order_num, from items group by order_num sum(total_price)

Obtendo o resultado: order_num 1001 1002 1003 1004 (sum) $250.00 $1200.00 $959.00 $2126.00

Manual de introduo ao SQL em Informix

Pgina 42

1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015

$562.00 $498.00 $1696.00 $940.00 $450.00 $84.00 $99.00 $1040.00 $143.80 $1440.00 $450.00

Vejamos agora um exemplo em que se especificam duas colunas na clusula GROUP BY. Neste exemplo pretende-se agrupar as encomendas por cliente e ms de pagamento da encomenda e obter o peso correspondente das encomendas agrupadas. select customer_num, month(paid_date), sum(ship_weight) from orders group by customer_num, 2 order by customer_num, 2

Obtendo-se o resultado: customer_num 101 104 106 106 110 110 111 112 115 116 117 117 (expression) 7 6 7 6 7 7 6 6 (sum) 50.60 127.20 95.80 40.60 20.60 45.60 20.40 70.80 40.60 80.80 125.90 70.80

NOTA: Se existirem valores NULLS na coluna especificada na clusula GROUP BY o INFORMIXSQL considerar como um grupo diferente cada linha que tenha NULLS nessa coluna.

2.8.4. A Clusula HAVING

Pode-se usar a clusula HAVING para especificar condies de pesquisa sobre os grupos selecionados pela clusula GROUP BY. HAVING significa que se pretende s aqueles grupos que Manual de introduo ao SQL em Informix Pgina 43

satisfazem a condio da clusula HAVING. Assim as condies da clusula HAVING devem testar propriedades de cada grupo e no propriedades de linhas individuais do grupo. A clusula HAVING escreve-se imediatamente a seguir clusula GROUP BY e pode conter o mesmo tipo de condies da clusula WHERE, desde que um dos membros da condio contenha uma uno de grupo.

Por exemplo se quiser saber os montantes totais das encomendas de artigos com STOCK_NUM inferior a 8 e com montantes totais superiores a 500 introduza e execute o seguinte query: select order_num, sum(total_price) from items group by order_num having max(stock_num) < 8 and sum(total_price) > 500

Obtendo o resultado: order_num 1002 1004 1005 1007 1014 (sum) $1200.00 $2126.00 $562.00 $1696.00 $1440.00

2.8.5. Operador UNION

Ao utilizar o operador UNION pode combinar duas ou mais instrues

SELECT para constituir

uma nica instruo SELECT. Quando o INFORMIX-SQL encontra o operador UNION, cria uma "tabela intermdia" que o resultado de cada uma das instrues SELECT ligadas pelo operador UNION e a seguir combina todas as "tabelas intermdias", eliminando as linhas duplicadas. Pode usar qualquer das clusulas e tcnicas que aprendeu at agora na codificao das instrues SELECT, incluindo ORDER BY. Por exemplo se pretender listar as encomendas de artigos fabricados pelo fabricante com

cdigo 'HRO' e simultneamente as encomendas com montante superior a 800 introduza execute o seguinte query: select order_num, manu_code

Manual de introduo ao SQL em Informix

Pgina 44

from items where manu_code = 'HRO' union select order_num, manu_code from items where total_price > 800

obtendo o resultado: order_num 1001 1004 1007 1014 1002 1003 1008 1012 1014 manu_code HRO HRO HRO HRO HSK ANZ ANZ ANZ HSK

Repare que, como no se usou a clusula ORDER BY, as linhas do resultado no esto ordenadas e que aparecem em primeiro lugar as linhas correspondentes primeira instruo SELECT. Para obter o resultado ordenado utilize o query: select order_num, manu_code from items where manu_code = "HRO" union select order_num, manu_code from items where total_price > 800 order by 1

NOTA: Qualquer clusula ORDER BY deve aparecer sempre depois da a instruo SELECT do UNION. Para especificar as colunas pelas quais deve ser ordenado o resultado use o nmero de ordem da coluna na clusula SELECT (num UNION no se pode usar o nome das colunas para este fim).

Se pretender manter no resultado as linhas duplicadas escreva ALL a seguir a UNION. No exemplo anterior teria: select order_num, manu_code Pgina 45

Manual de introduo ao SQL em Informix

from items where manu_code = 'HRO' union all select order_num, manu_code from items where total_price > 800 order by 1

Obtendo o resultado: order_num 1001 1002 1003 1004 1004 1004 1007 1007 1007 1007 1008 1012 1014 1014 manu_code HRO HSK ANZ HRO HRO HRO HRO HRO HRO HRO ANZ ANZ HRO HSK

No UNION os valores das colunas especificadas num SELECT devem ter o mesmo tipo de dados e o mesmo comprimento dos correspondentes valores das colunas dos outros SELECTS.

2.8.6. JOIN - Seleco de Linhas em mais de uma Tabela

Nos exemplos de instruces SELECT utilizados at agora, a informao requerida residiu sempre numa nica tabela. Muitas vezes a informao pretendida no reside numa nica tabela. Ao formar uma "tabela resultado", pode precisar de algumas colunas de uma tabela e doutras colunas de outra tabela. Pode utilizar uma instruo SELECT para selecionar e juntar (Join) valores de colunas de duas ou mais tabelas.

No JOIN os valores das colunas da linha duma tabela so combinados com valores de colunas de outra tabela para formarem uma nica linha da "tabela resultado". O INFORMIX-SQL pesquisa ambas

Manual de introduo ao SQL em Informix

Pgina 46

as

tabelas especificadas no SELECT de "join" para selecionar valores de todas as linhas que

satisfaam as condies da clusula WHERE.

Por exemplo para obter a lista das encomendas e respectivos nmeros e nomes dos clientes precisa de colunas da tabela ORDERS (order_num, customer_num) e da tabela CUSTOMER (company). Para executar este JOIN escreva a instruo SELECT com as duas tabelas na clasula FROM e quando existirem colunas da tabelas diferentes com o mesmo nome devem ser prefixadas com o nome da tabela para se distinguirem. Introduza o query: select from where order_num, orders.customer_num, company orders, customer orders.paid_date is null and orders.customer_num = customer.customer_num

Obtendo o resultado: order_num 1004 1006 1007 1012 customer_num 106 112 117 117 company Watson & Son Runners & Others Kids Korner Kids Korner

Nos casos em que existam condies de seleco complexas torna-se pouco prtico prefixar as colunas com o nome das tabelas. Tem a alternativa de introduzir, imediatamente a seguir ao nome da tabela na clusula FROM, um prefixo sua escolha. Por exemplo o query: select from where and and it.order_num, od.customer_num, cu.company items it, orders od, customer cu it.stock_num = 6 od.order_num = it.order_num cu.customer_num = od.customer_num

obtendo o resultado: order_num 1005 1006 1010 1013 1005 1006 1010 1013 customer_num 116 112 115 104 116 112 115 104 company Olympic City Runners & Others Gold Medal Sports Play Ball! Olympic City Runners & Others Gold Medal Sports Play Ball! Pgina 47

Manual de introduo ao SQL em Informix

Quando se pretende seleccionar valores de colunas de mais de uma tabela, mas com todas as linhas da tabela, especificada em primeiro lugar na clusula FROM, presentes no resultado satisfazendo ou no as condies de join diz-se que temos um OUTER JOIN. O INFORMIX-SQL permite executar OUTER JOINS, associando o valor NULL s colunas do resultado correspondentes tabela em segundo

lugar na clusula FROM, nas linhas que no satisfazem as condies de join. Para indicar um outer join basta escrever a palavra OUTER antes da tabela especificada em segundo lugar na clusula FROM. Veja o exemplo: select order_num, orders.customer_num, company, zipcode from orders, outer customer where orders.paid_date is null and orders.customer_num = customer.customer_num and customer.zipcode like '9402_'

Obtendo o resultado: order_num 1004 1006 1007 1012 customer_num 106 112 117 117 company Runners & Others zipcode 94022

2.8.7. Subqueries

As condies de pesquisa da clusula WHERE da instruo SELECT possibilitam ainda: -Comparar uma expresso com o resultado de outra instruo SELECT. -Determinar se uma expresso est includa no resultado de outra instruo SELECT. -Verificar se existem linhas seleccionadas por outra instruo SELECT.

s instrues SELECT chamadas por clusulas WHERE de outras instrues SELECT chamam-se SUBQUERIES. Dum subquery pode resultar um valor, nenhum valor ou um conjunto de valores, mas deve conter uma s coluna ou expresso na lista das colunas selecionadas para o resultado e no deve ter clusula ORDER BY.

Manual de introduo ao SQL em Informix

Pgina 48

Para identificar e testar as vrias situaes de subqueries citadas introduzem-se os parmetros, que se descrevem a seguir,imediatamente antes da instruo SELECT do subquery. O subquery deve ser escrito entre parntesis. ALL Indica que o subquery pode retornar nenhum, um ou mais valores e que a condio de pesquisa (do SELECT do primeiro nvel) verdadeira se a comparao for verdadeira para todos os valores retornados. Se o subquery no retornar nenhum valor a condio pesquisa verdadeira. ANY Indica que o subquery pode retornar nenhum, um ou mais valores e que a condio de pesquisa (do SELECT do primeiro nvel) verdadeira se a comparao for verdadeira para pelo menos um valor retornado. Se o subquery no retornar nenhum valor a condio de pesquisa falsa. SOME IN EXISTS Tem a mesma funo que ANY. Verifica se a expresso da condio de seleco est contida no resultado do subquery. Verifica se o subquery retorna linhas . A condio de seleco verdadeira se o subquery retornar pelo menos uma linha. NOT Aplica-se antes dos parmetros anteriores e que nega os seus valores lgicos. de

Vejamos alguns exemplos:

Exemplo 1: select from and order_num items where stock_num = 9 quantity = (select max(quantity) from items where stock_num = 9)

Tendo como resultado: order_num 1012

Este subquery retorna um nico valor

[MAX(QUANTITY)]. O objectivo deste exemplo

obter a lista das encomendas ou a encomenda do maior nmero de artigos com cdigo de stock igual a 9.

Manual de introduo ao SQL em Informix

Pgina 49

Exemplo 2: select from where distinct order_num items total_price > all (select total_price from items where order_num = 1005)

Tendo como resultado: order_num 1002 1003 1004 1007 1008 1009 1012 1014 1015

Este subquery retorna vrios valores. O exemplo lista todas as encomendas

que tenham pelo

menos uma linha de encomenda que tenha preo total superior a todas as linhas da encomenda 1005.

Exemplo 3: select distinct customer_num from orders where order_num not in (select order_num from items where stock_num = 1)

Tendo como resultado: customer_num 101 104 116

Manual de introduo ao SQL em Informix

Pgina 50

112 110 115 117 106

Este exemplo lista todos os clientes que no encomendaram artigos com cdigo de stock igual a 1.

Exemplo 4: select customer_num from customer where customer_num = any (select customer_num from orders where paid_date is null) Tendo como resultado: customer_num 106 112 117

Este exemplo lista todos os clientes que fizeram encomendas que ainda no foram pagas.

Exemplo 5: select o.order_num from orders o where exists (select * from customer c where phone like '415%' and c.customer_num = o.customer_num)

Tendo como resultado: order_num 1001 1003 Manual de introduo ao SQL em Informix Pgina 51

1004 1005 1006 1007 1008 1010 1011 1012 1013 1014 1015

Este exemplo lista todas as encomendas que foram feitas por clientes que tenham nmero de telefone comeado por 415.

2.8.8. INTO TEMP - Criao dum Resultado numa Tabela Temporria

A clusula INTO TEMP cria uma tabela temporria que contm o resultado do query. Esta tabela desaparece quando se termina a sesso do INFORMIX-SQL. Os nomes das colunas da tabela

temporria so iguais aos das colunas selecionadas pela instruo SELECT e a tabela temporria no tem indices associados. Vamos guardar o resultado dum query, j utilizado temporria RESULT. select from where it.order_num, od.customer_num, cu.company items it, orders od, customer cu it.stock_num = 6 and od.order_num = it.order_num and cu.customer_num = od.customer_num into temp result como exemplo anteriormente, na tabela

Para visualizarmos o resultado temos de introduzir a instruo: select * from result

Obtendo o resultado: order_num customer_num company

Manual de introduo ao SQL em Informix

Pgina 52

1005 1006 1010 1013 1005 1006 1010 1013

116 112 115 104 116 112 115 104

Olympic City Runners & Others Gold Medal Sports Play Ball! Olympic City Runners & Others Gold Medal Sports Play Ball!

2.9. Views

Quando se define uma VIEW (vista) sobre uma tabela, esta parecer que contm apenas as colunas e linhas de que precisa. Funciona como se tivesse criado uma nova tabela contendo apenas as colunas e linhas necessrias ao seu trabalho. Trabalha-se com uma view como se fosse uma tabela, embora a view esteja totalmente dependente dos dados duma ou mais tabelas. A view no possui dados prprios e portanto no necessita de espao em disco para os guardar. Como uma view deriva duma tabela j existente, quando alterar dados da view, estar na realidade a alterar dados da tabela. Logo os dados das views parecero que so automticamente alteradas logo que as tabelas de que dependem forem alteradas. medida que os dados duma tabela so alterados, tambm os dados que so acessveis atravs duma view, definida sobre essa tabela, sero alterados. Pode alterar os dados acedidos por uma view desde que a view esteja definida sobre uma nica tabela , que nenhuma das suas colunas seja uma expresso ou funo das colunas da tabela e tiver autorizao para alterar os dados da view. O administrador da base de dados pode criar vrias views diferentes sobre a mesma tabela. Assim os utilizadores tero acesso apenas aos dados que necessitem. As views diminuem a complexidade e ao mesmo tempo restringem o acesso. Quando utiliza uma view (em vez da tabela sobre a qual foi definida a view), no pode aceder a outras linhas ou colunas que no estejam includas na view. Em geral existem duas razes para usar views: Uma view pode evitar que utilizadores no autorizados tenham acesso a dados importantes (por exemplo pode aceder a uma view da tabela de pessoal e no aceder coluna de salrios). Ao usar uma view as instrues de RDSQL tornam-se mais fceis de escrever e os resultados mais manejveis pois s se apercebe das colunas e linhas de que precisa.

Vamos criar uma view sobre as tabelas ITEMS, ORDERS e CUSTOMER de modo a que se possa ter ligado a cada encomenda o nmero de encomenda, o preo total da encomenda e a identificao do cliente.

Manual de introduo ao SQL em Informix

Pgina 53

create view resorder (order_num, customer_num, company,price) as select i.order_num, o.customer_num, c.company, sum(i.total_price) from items i, orders o, customer c where o.order_num = i.order_num and c.customer_num = o.customer_num group by 1,2,3

Para visualizar a view criada entre o query: select * from resorder

Obtendo o resultado: order_num 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 customer_num 104 101 104 106 116 112 117 110 111 115 104 117 104 106 110 company Play Ball! All Sports Supplies Play Ball! Watson & Son Olympic City Runners & Others Kids Korner AA Athletics Sports Center Gold Medal Sports Play Ball! Kids Korner Play Ball! Watson & Son AA Athletics price $250.00 $1200.00 $959.00 $2126.00 $562.00 $498.00 $1696.00 $940.00 $450.00 $84.00 $99.00 $1040.00 $143.80 $1440.00 $450.00

Note que os dados desta view no podem ser actualizados.

NOTA: Na instruo SELECT associada a CREATE VIEW no pode utilizar a clusula ORDER BY nem o operador UNION. No pode utilizar com uma view as seguintes instrues do RDSQL: TABLE, ALTER INDEX, CREATE INDEX e DROP INDEX. ALTER

Manual de introduo ao SQL em Informix

Pgina 54

2.10. Transaces

Chama-se TRANSACO a uma sria de operaes (instruces de RDSQL) sobre a base de dados que constituem um bloco coerente de tratamento da informao e, s depois de todas as operaes do bloco terem sido completadas com sucesso ou no, que a base de dados actualizada ou reposta na situao imediatamente anterior ao incio da transaco. Para poder usar transaces tem de criar um ficheiro que registe todas as modificaes da base de dados. o "transation log file". Pode cri-lo quando cria a base de dados com a clusula WITH LOG IN da instruo CREATE DATABASE ou, no caso da base de dados j ter sido criada sem log file, com a instruo START DATABASE. Inicia-se uma transaco com a instruo BEGIN WORK e conclui-se com as instrues COMMIT WORK, para actualizar a base de dados, ou ROLLBACK WORK, para repor a situao anterior transaco.

Vejamos alguns exemplos: 1close start Vamos primeiro criar o log file da base de dados STORES. database; database

stores

with

log

in "/usr/login/stlog"

2-

A seguir vamos iniciar uma transaco e inserir algumas linhas na tabela FABRICANTE:

begin work; insert into fabricante values ('MNM', 'manom'); insert into fabricante values ('DIP', 'dipar'); rollback work Como se terminou a transaco com ROLLBACK WORK as inseres no foram efectuadas, como verificaro ao executar o query: select * from fabricante

Obtendo o resultado: manu_code SMT NRG HSK Manual de introduo ao SQL em Informix manu_name Smith Norge Husky Pgina 55

HRO

Hero

3-

A seguir vamos executar a mesma transaco, mas termiando-a com COMMIT WORK:

begin work; insert into fabricante values ('MNM', 'manom'); insert into fabricante values ('DIP', 'dipar'); commit work

Neste exemplo as inseres foram efectuadas, como verificaro o executar o query: select * from fabricante

Obtendo o resultado: manu_code DIP MNM SMT NRG HSK HRO manu_name dipar manom Smith Norge Husky Hero

Depois de iniciada a transaco e enquanto no for terminada, quer por COMMIT WORK quer por ROLLBACK WORK, todas as linhas que forem alteradas pela transaco ficam protegidas (locked) e mais nenhum utilizador pode aceder a essas linhas para alterao (embora possa consult-las). Existe um nmero mximo de linhas que podem estar protegidas simultnemente por todos os utilizadores. Esse nmero depende do sistema operativo. Nos casos em que este facto possa causar problemas pode super-lo protegendo toda a tabela at terminar a transaco. Para proteger a tabela use a instruo LOCK TABLE IN [SHARE ou EXCLUSIVE] MODE. Se usar SHARE os restantes utilizadores podem consultar a tabela. Se usar EXCLUSIVE mais nenhum utilizador pode aceder tabela quer em consulta quer em alterao. A instruo LOCK TABLE deve ser escrita imediatamente a seguir a BEGIN WORK, no caso de ser utilizada numa transaco. Vejamos como se protegeria a tabela FABRICANTE num dos exemplos de transaco anteriores: begin work; lock table fabricante in share mode; insert into fabricante values ('MNM', 'manom'); insert into fabricante values ('DIP', 'dipar'); commit work

Manual de introduo ao SQL em Informix

Pgina 56

Sempre que se tenha protegido uma tabela, esta no pode ser protegida por mais nenhum utilizador, enquanto a transaco no tiver terminado ou executar o comando UNLOCK TABLE (no caso de no ter iniciado uma transaco).

2.11. Segurana

2.11.1. Autorizaes

Se criar uma base de dados fica automticamente como o administrador dessa base de dados. Nesta altura a nica pessoa que tem acesso base de dados. Para que outros utilizadores tenham acesso base de dados tem de lhes dar autorizao. Existem os seguintes trs nveis de acesso a bases de dados: CONNECT Permite o acesso s tabelas da base de dados sem permisso de criar permanentes e indices. RESOURCE Permite o acesso s tabelas da base de dados com permisso de criar permanentes e indices. DBA Permite os mesmos privilgios do administrador da base de dados. Alm das autorizaes concedidas sobre a base de dados o criador duma tabela tambm pode conceder autorizaes sobre essa tabela a outros utilizadores. Existem as seguintes autorizaes de acesso a tabelas: ALTER DELETE INDEX INSERT SELECT [(cols)] Autoriza a adicionar e subtrair colunas ou modificar o tipo de dados da tabela. Autoriza a apagar linhas da tabela. Autoriza a criar indices. Autoriza a inserir linhas na tabela. Autoriza a consultar dados da tabela ou das suas colunas especificadas entre parentesis. UPDATE [(cols)] Autoriza a alterar dados da tabela ou das suas parentesis. ALL Concede todas as autorizaes acima descritas. colunas especificadas entre tabelas tabelas

a instruo GRANT que permite conceder autorizaes quer a bases de dados quer a tabelas.

Manual de introduo ao SQL em Informix

Pgina 57

Pode conceder autorizao para que o utilizador tambm conceda autorizaes sobre a tabela se usar a clusula WITH GRANT OPTION. As autorizaes (para bases de dados e para tabelas) so concedidas a utilizadores (descritos pelos respectivos logins) ou ento a todos os utilizadores escrevendo a clusula PUBLIC. Em caso de conflito entre autorizaes sempre a autorizao mais restritiva que tem

preferncia. Por exemplo se um utilizador tem nvel RESOURCE para uma base de dados, mas no tem autorizao para criar indices numa tabela esta ltima situao que prevalece. Como exerccios prope-se que se concedam autorizaes sobre as tabelas da base de dados STORES existente na sua rea a outros colegas de curso. Vejamos alguns exemplos hipotticos de utilizao da instruo GRANT: grant grant grant grant stores connect to public; stores dba to joao; all on fabricante to luis, sergio; select on fabricante to public

Para retirar autorizaes a utilizadores usa-se a instruo REVOKE. Por exemplo revoke delete on fabricante from luis

2.11.2. Recuperao de Dados

Este ponto deve ser abordado num curaso dirigido para a admnistrao de dados e no num curso de introduo como este. No entanto convm realar alguns aspectos que podem interessar a quem programa. O instrumento mais potente de recuperao de dados o j nosso conhecido "transaction log file". Este ficheiro contm as operaes sobre a base de dados desde o instante imediatamente aps ter sido gravado um ficheiro de backup. Com estes dois ficheiros e usando a instruo ROLLFORWARD

DATABASE possivel recuperar a base de dados at ao COMMIT WORK da ltimo transaco executada. Existe tambm a possibilidade de registar as operaes executadas sobre uma tabela num ficheiro a que se chama AUDIT TRAIL. Pode-se recuperar a tabela atravs da instruo RECOVER AUDIT. Este processo pode ser usado com o "transaction log file" ou como alternativa a este.

Manual de introduo ao SQL em Informix

Pgina 58

3. Apndice 1

DESCRICAO DA BASE DE DADOS STORES.

DESPODATA/DE1 PROJECTO: Informix-sql

* MODELO DE DADOS *

REF:STODE1 BASE DADOS: Stores

Manual de introduo ao SQL em Informix

Pgina 59

DESPODATA/DE1 PROJECTO: Informix-sql IDENTIFICAO 1 2 3 4 5

* LISTA DE ENTIDADES *

REF:STODE1 BASE DADOS: Stores CHAVES ESTRANGEIRAS customer_num stock_num + manu_code O/R

DESIGNAO customer orders items stock manufact

CHAVES PRIMRIAS customer_num order_num item_num + order_num stock_num + manu_code manu_code

Manual de introduo ao SQL em Informix

Pgina 60

DESPODATA/DE1 PROJECTO: Informix-sql

* DETALHE DE ENTIDADES *

REF:STODE1 BASE DADOS: Stores

IDENTIFICAO 1 CUSTOMER customer_num fname lname company address1 address2 city state zipcode phone 2 ORDERS order_num order_date customer_num ship_instruct backlog po_num ship_date ship_weight ship_charge paid_date 3 ITEMS item_num order_num stock_num manu_code quantity total_price 4 STOCK stock_num manu_code description unit_price unit unit-descr 5 MANUFACT manu_code manu_name

m s

EXPLICAES / OBSERVAES CLIENTES Nmero de identificao do cliente Primeiro nome do cliente Ultimo nome do cliente Empresa Linha 1 da morada Linha 2 da morada Cidade Estado Cdigo postal Telefone ENCOMENDAS Nmero identificador da encomenda Data da encomenda Nmero do cliente que fez a encomenda Instrues para a entrega Nmero de referncia da encomenda Data de expedio Peso da encomenda Despesas com a expedio Data de pagamento LINHAS DE ENCOMENDA Nmero da linha de encomenda Nmero identificador da encomenda Nmero do artigo Cdigo identificador do fabricante Quantidade do artigo encomendado Preo total da linha de encomenda ARTIGOS Nmero do artigo Cdigo identificador do fabricante Descrio do artigo Preo unitrio Unidade Descrio da unidade FABRICANTE Cdigo do fabricante Nome do fabricante

TIPO serial char char char char char char char char char serial date integer char char char date decimal money date smallint integer smallint char smallint smallint 3 40 1 10 8,2 6 101 15 15 20 20 20 15 2 5 13 1001

smallint char char money char char char char

3 15 6 4 15 3 15

Manual de introduo ao SQL em Informix

Pgina 61

DESPODATA/DE1 PROJECTO: Informix-sql

* ESQUEMA *

REF:STODE1 BASE DADOS: Stores

Esquema de ligao entre as tabelas da base de dados STORES


items item_num order_num stock_num manu_code quantity total_price

customer customer_num fname lname company address1 address2 city state zipcode phone

orders order_num order_date customer_num ship_instruct backlog po_num ship_date ship_weight ship_charge paid_date

stock stock_num manu_code description unit_price unit unit-descr

manufact manu_code manu_name

Manual de introduo ao SQL em Informix

Pgina 62

Оценить