Академический Документы
Профессиональный Документы
Культура Документы
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
Pgina 2
1. INTRODUO
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.
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
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).
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:
1-
A(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.
2-
As 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
Esquema grfico representando as 5 tabelas da base de dados e a forma como se ligam entre si.
Pgina 5
1.2. DBACCESS
Para aceder ao DBACCESS digite dbaccess e aparecer no ecran o Main Menu do dbaccess, se este
estiver bem instalado.
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.
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.
As tarefas que o DBACCESS permite executar so sempre iniciadas a partir de seleco duma opo
do Main Menu.
Query - Language
Permite criar, retirar e modificar uma tabela e consultar informaes sobre a tabela.
Exit
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
Pgina 7
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
Pgina 8
INFORMIXTERM=termcap
export INFORMIXTERM
TERM e TERMCAP
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:
Pgina 9
DBDATE
mdy2/
dmy2/
dmy4/
mdy4/
y4mdy2md/
DBMONEY
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:
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
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.
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
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.
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
Info
Drop
Exit
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 "{...}".
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.
Pgina 13
Saia do ecran CHOOSE DATABASE pressionando a tecla DEL. -> Aparece-lhe o ecran de 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.
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.
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)
Alfanumrico de comprimento n.
SMALLINT
Pgina 14
INTEGER
DECIMAL(m,n)
SMALLFLOAT
FLOAT
MONEY(m,n)
SERIAL(n)
comea no inteiro n.
DATE
DATETIME
INTERVAL
VARCHAR (m,n)
indefinido
Texto
de
comprimento
BYTE
S INFORMIX On Line
Pgina 15
Os dados so
numricos?
no
Os nmeros so
inteiros ?
sim
no
Os nmeros so todos
entre -32767 e 32767 ?
sim
no
Os nmeros so todos
entre -2 bilies e 2
bilies ?
sim
INTEGER
no
Ns. fraccionrios com
n fixo de casas
sim
DECIMAL(p,0)
no
Mx. de 8 algarismos
significativos ?
DECIMAL(p,s)
sim
no
Mx. de 16 algarimos
significativos ?
SMALLINT
SMALLFOAT
sim
FLOAT
DECIMAL(p)
sim
Os dados so
cronolgicos?
no
intervalo
um intervalo de
tempo ou um instante ?
INTERVAL
sim
no
DATE
Contm caracteres
acentuados ?
sim
DATETIME
no
Comprimento fixo ou
pouco varivel ?
sim
no
NCHAR(n)
NVARCHAR(m,r)
Caracteres ASCII ?
no
sim
Comprimento fixo ou
pouco varivel ?
sim
no
BYTE
O comprimento excede
os 255 bytes ?
sim
no
CHARACTER
VARYNG(m,r) ou VARCHAR(m,r)
sim
no
CHAR(n)
TEXT
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.
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 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.
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:
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
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
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
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
lista de colunas
lista de tabelas
condies
lista de colunas
Um exemplo:
SELECT
FROM
WHERE
ORDER BY
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.
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
*
stock
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
unit_descr
stock
unit='case
*
stock
stock_num=5
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.
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).
SELECT
FROM
WHERE
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".
*
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
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
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
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:
Pgina 25
select
order_date, customer_num,
from
orders
where
paid_date is not null
order by order_date desc,customer_num
order_num
obtendo-se o relatrio:
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.
obtendo-se o relatrio:
1
1
1
2
HRO
HSK
SMT
HRO
baseball gloves
baseball gloves
baseball gloves
baseball
Pgina 26
HSK
baseball bat
AS instrues que se seguem querem dizer, "Mostre todos os artigos cuja descrio
tenha
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
HRO
basketball
Pode usar NOT antes de LIKE para especificar os valores que quer excluir. Por exemplo :
select
from
Pgina 27
5
5
5
NRG
SMT
ANZ
tennis racquet
tennis racquet
tennis racquet
select
order_num,order_date,customer_num,
ship_instruct
orders
order_date between '01/01/1984' and '06/30/1984'
and paid_date is null
from
where
obtendo-se o relatrio:
1004
1006
1007
1012
06/04/1984
06/04/1984
06/04/1984
06/05/1984
106
112
117
117
Usando OR
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
Pgina 28
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:
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
1014
1015
06/05/1984
06/06/1984
106
110
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).
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
Pgina 30
where
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
adio
subtraco
multiplicao
diviso
Este query
select
stock_num,
from
items
where order_num = 1005
manu_code,
(total_price/quantity)
5
5
6
6
NRG
ANZ
SMT
ANZ
$28.00
$19.80
$36.00
$48.00
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.)
manu_code
SMT
ANZ
(expression)
$36.00
$48.00
manu_code
ANZ
(expression)
$19.80
Pgina 32
5
6
6
NRG
SMT
ANZ
$28.00
$36.00
$48.00
clusula
SELECT".(No
At ao fim deste captulo a maior parte dos exerccios sero feitos sobre a tabela FABRICANTE
que uma rplica da tabela MANUFACT.
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.
Pgina 33
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
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
possibildades
do
SELECT"
Pgina 34
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
manu_code
HRO
HSK
SMT
2
3
4
4
5
5
5
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
unit
case
unit_descr
10 gloves/case
$800.00
case
10 gloves/case
$450.00
case
10 gloves/case
$126.00
$240.00
$1056.00
$528.00
$28.00
$25.00
$19.80
case
case
case
case
each
each
each
24/case
12/case
24/case
24/case
each
each
each
Pgina 35
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.
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.
Pgina 36
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.
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.
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.
Pgina 37
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
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
Pgina 38
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.
AVG
Pgina 39
MAX
Selecciona o
valor
mnimo
contido
na
SUM
DISTINCT
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
Pgina 40
DAY()
MONTH()
YEAR()
WEEKDAY()
Extrai duma data um inteiro que representa o dia da semana. Este inteiro varia de
(domingo) a 6 (sbado).
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
Obtendo_se o resultado:
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.
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.
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
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.
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
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
cdigo 'HRO' e simultneamente as encomendas com montante superior a 800 introduza execute o seguinte
query:
select
order_num, manu_code
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
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.
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
Pgina 46
as
tabelas especificadas no SELECT de "join" para selecionar valores de todas as linhas que
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
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
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
zipcode
94022
2.8.7. Subqueries
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.
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
de
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
NOT
Aplica-se antes dos parmetros anteriores e que nega os seus valores lgicos.
Exemplo 1:
select
from
and
order_num
items where stock_num = 9
quantity = (select max(quantity)
from items
where stock_num = 9)
obter a lista das encomendas ou a encomenda do maior nmero de artigos com cdigo de stock igual a 9.
Pgina 49
Exemplo 2:
select
from
where
distinct order_num
items
total_price > all (select total_price
from items
where order_num = 1005)
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)
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)
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.
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.
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
como
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
Obtendo o resultado:
order_num
customer_num
company
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.
Pgina 53
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
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:
ALTER
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.
2-
stores
with
log
in "/usr/login/stlog"
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
3-
Hero
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
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
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
tabelas
permanentes e indices.
RESOURCE
tabelas
permanentes e indices.
DBA
DELETE
INDEX
INSERT
SELECT [(cols)]
UPDATE [(cols)]
parentesis.
ALL
a instruo GRANT que permite conceder autorizaes quer a bases de dados quer a tabelas.
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
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
delete
on
fabricante
from
luis
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.
Pgina 58
3. Apndice 1
DESPODATA/DE1
PROJECTO: Informix-sql
* MODELO DE DADOS *
REF:STODE1
BASE DADOS: Stores
Pgina 59
DESPODATA/DE1
PROJECTO: Informix-sql
* LISTA DE ENTIDADES *
IDENTIFICAO
DESIGNAO
1
2
3
customer
orders
items
stock
manufact
CHAVES
PRIMRIAS
customer_num
order_num
item_num +
order_num
stock_num +
manu_code
manu_code
REF:STODE1
BASE DADOS: Stores
CHAVES
ESTRANGEIRAS
O/R
customer_num
stock_num +
manu_code
Pgina 60
DESPODATA/DE1
PROJECTO: Informix-sql
IDENTIFICAO
1 CUSTOMER
customer_num
m
s
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
* DETALHE DE ENTIDADES *
REF:STODE1
BASE DADOS: Stores
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
TIPO
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
description
unit_price
unit
unit-descr
ARTIGOS
Nmero do artigo
Cdigo identificador do
fabricante
Descrio do artigo
Preo unitrio
Unidade
Descrio da unidade
5 MANUFACT
manu_code
manu_name
FABRICANTE
Cdigo do fabricante
Nome do fabricante
serial
101
char
char
char
char
char
char
char
char
char
15
15
20
20
20
15
2
5
13
serial
1001
date
integer
char
char
char
40
1
10
date
decimal
money
date
8,2
6
smallint
integer
smallint
char
smallint
smallint
smallint
char
char
money
char
char
15
6
4
15
char
char
3
15
Pgina 61
DESPODATA/DE1
PROJECTO: Informix-sql
* ESQUEMA *
REF:STODE1
BASE DADOS: Stores
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
items
item_num
order_num
stock_num
manu_code
quantity
total_price
stock
stock_num
manu_code
description
unit_price
unit
unit-descr
manufact
manu_code
manu_name
Pgina 62