Intro SQL Informix
Intro SQL Informix
Intro SQL 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
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.
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
identificao, fabricante, descrio e preo de cada artigo. 5. manufact FABRICANTE: Contm a identificao e o nome do fabricante.
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
1 2 3
col1 1 2 3
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.
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.
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
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
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.
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
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
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:
Pgina 8
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
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
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
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.
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
Salvaguarda o conjunto actual de instrues num ficheiro de comandos. O RDSQL acrescenta a extenso ".sql" ao nome dado ao ficheiro.
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.
Como exerccio vamos criar a base de dados TESTE. Selecione a opo Query-language do Main Menu. -> Aparece-lhe o ecran CHOOSE DATABASE.
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.
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.
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) SMALLINT
Pgina 14
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)
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
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
Pgina 15
sim
no
Os nmeros so inteiros ?
sim
no sim
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
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
BYTE
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.
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:
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
Vamos suprimir a tabela CLIENT-A. Digite o query : drop table client-a e execute-o confirmando com a opo Info.
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 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.
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.
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
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
stock_num 5 5 5
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).
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".
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
Pgina 23
5 6 6 9
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
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:
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
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 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.
obtendo-se o relatrio:
1 1 1 2
Pgina 26
HSK
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
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
Pgina 27
where description not like '%ball%' Encontrar todos os artigos cuja descrio no inclua "ball".
5 5 5
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:
O query seguinte selecciona as encomendas e respectivos clientes que tenham peso superior a 20 ou montante de expedio superior a 15.
order_num, order_date, customer_num, ship_weight, ship_charge orders ship_weight > 20 or ship_charge > 15 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: 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
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).
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
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
5 5 6 6
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.)
produz o seguinte relatrio stock_num 6 6 manu_code SMT ANZ (expression) $36.00 $48.00
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
ORDER BY 3 significa "ordenado pela terceira coluna specificada na escreva ORDER BY -espresso aritmtica- pois no funciona).
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.
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
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"
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 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
6 6 7 8 9
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
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.
Suponha que pretende criar na tabela ITEMS, um indice composto sobre as colunas ITEM_NUM e ORDER_NUM e que no pretende entradas duplicadas.
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 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
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.
Pgina 38
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).
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
Calcula a mdia de todos os valores da coluna especificada que satisfaam a clusula WHERE. S se pode aplicar AVG a colunas numricas.
Pgina 39
MAX
Selecciona o valor mximo contido na coluna especificada que satisfaam a clusula WHERE.
MIN
Selecciona o
valor
mnimo
contido
na
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
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
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
(expression) 1 4 4 5
Obtendo_se o resultado:
Pgina 41
(expression) 32 43 47 43
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.
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
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 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
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 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.
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
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)
Tendo como resultado: order_num 1002 1003 1004 1007 1008 1009 1012 1014 1015
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
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.
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
Pgina 52
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
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
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: TABLE, ALTER INDEX, CREATE INDEX e DROP INDEX. 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.
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
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.
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
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.
Pgina 58
3. Apndice 1
* MODELO DE DADOS *
Pgina 59
* LISTA DE ENTIDADES *
REF:STODE1 BASE DADOS: Stores CHAVES ESTRANGEIRAS customer_num stock_num + manu_code O/R
Pgina 60
* DETALHE DE ENTIDADES *
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
3 15 6 4 15 3 15
Pgina 61
* ESQUEMA *
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
Pgina 62