Escolar Documentos
Profissional Documentos
Cultura Documentos
Manual - 10º I - SI - Módulo2 - ProgramaçãoSQL
Manual - 10º I - SI - Módulo2 - ProgramaçãoSQL
SISTEMAS DE INFORMAÇÃO
Índice
Introdução ....................................................................................................................................... 3
A quem se destina? ........................................................................................................................ 4
Onde é que se pode utilizar? .......................................................................................................... 4
Quais são os objectivos do SQL? ................................................................................................... 4
Quais são as características do SQL? ............................................................................................ 5
A cláusula de selecção “Select” ...................................................................................................... 6
Operadores especiais utilizados em SQL........................................................................................ 7
A cláusula de ordenação (“Order By”) ............................................................................................. 9
Selecção de expressões ................................................................................................................. 9
Eliminação de repetições .............................................................................................................. 10
Junção de tabelas ......................................................................................................................... 10
Tipos de Junções “Joins” .............................................................................................................. 10
Funções Agregadas ...................................................................................................................... 13
Agrupamento de informação ......................................................................................................... 14
Agrupamentos e o valor “Nul” ....................................................................................................... 16
Ordenação de Grupos................................................................................................................... 16
Sub-Consultas (“SubQuerys”) ....................................................................................................... 17
Manipulação de Dados (DML)....................................................................................................... 20
Inserção de registos simples......................................................................................................... 20
Inserção de conjuntos de registos................................................................................................. 20
Actualização de registos ............................................................................................................... 21
Eliminação de registos .................................................................................................................. 21
Manipulação de datas ................................................................................................................... 22
Criação e manutenção de tabelas (DDL) ...................................................................................... 22
Criar uma base de dados .............................................................................................................. 22
Eliminar uma base de dados......................................................................................................... 22
Criar uma tabela ........................................................................................................................... 23
Tipos de dados ............................................................................................................................. 23
Valores por defeito ........................................................................................................................ 25
Valores a admitir (restrições) ........................................................................................................ 25
Criação de tabelas a partir de outras tabelas ................................................................................ 26
Alterar a estrutura de uma tabela .................................................................................................. 26
Eliminar uma tabela ...................................................................................................................... 27
Visões (“Views”) em SQL (SQLServer e Oracle) ........................................................................... 27
Juntando várias tabelas numa “View” (SQLServer e Oracle) ........................................................ 28
Cláusula “With Check Option” (SQLServer e Oracle) .................................................................... 28
Eliminar Visões (SQLServer e Oracle) .......................................................................................... 29
Criação de Índices ........................................................................................................................ 29
Eliminação de índices ................................................................................................................... 30
Introdução
Quando as Bases de Dados Relacionais estavam a ser desenvolvidas, foram criadas linguagens
destinadas à sua manipulação. O Departamento de Pesquisas da IBM, desenvolveu o SQL (lê-se
SEQUEL) como interface para o sistema de BD relacional denominado SYSTEM R, no início dos
anos 70. Em 1986 o “American National Standard Institute” (ANSI), publicou um padrão SQL.
O SQL estabeleceu-se então como linguagem padrão das Bases de Dados Relacionais.
O SQL apresenta uma série de comandos que permitem a definição dos dados, chamada de DDL
(“Data Definition Language”), composta entre outros pelos comandos “Create”, que é destinado à
criação da Base de Dados, das Tabelas que o compõe, além das relações existentes entre as
tabelas. Como exemplo de comandos da classe DDL temos os comandos “Create”, “Alter” e
“Drop”.
Os comandos da série DML (“Data Manipulation Language”), destinados a consultas, inserções,
exclusões e alterações em um ou mais registros de uma ou mais tabelas de maneira simultânea.
Como exemplo de comandos da classe DML temos os comandos “Select”, “Insert”, “Update” e
“Delete”.
Uma subclasse de comandos DML, a DCL (“Data Control Language”), dispõe de comandos de
controlo como “Grant” e “Revoke”.
A Linguagem SQL tem como grandes virtudes a capacidade de gerir índices, sem a necessidade
de controlo individualizado de índice corrente, algo muito comum nas linguagens de manipulação
de dados do tipo registro a registro. Outra característica muito importante disponível em SQL é
sua capacidade de construção de visões, que são formas de visualizarmos os dados na forma de
listagens independente das tabelas e organização lógica dos dados.
Outra característica interessante na linguagem SQL é a capacidade que dispomos de cancelar
uma série de actualizações ou de as gravarmos, depois de iniciarmos uma sequência de
actualizações. Os comandos “Commit” e “Rollback” são responsáveis por estas facilidades.
Devemos notar que a linguagem SQL consegue implementar estas soluções, somente pelo facto
de estar baseada em Base de Dados, que garantem por si mesmo a integridade das relações
existentes entre as tabelas e seus índices.
A quem se destina?
Esta linguagem destina-se essencialmente a programadores, administradores de base de dados,
gestores, estudantes e utilizadores em geral.
Dos principais SGBDR conhecidos do mercado actual, é de destacar o Access, SQL Server,
MySQL, Oracle, SQL AnyWhere, Informix, Paradox, entre outros.
Salienta-se contudo que, as versões de SQL utilizadas nestas diferentes plataformas, diferem
ligeiramente (em determinadas operações), visto haver ainda algumas situações que passam pela
utilização de comandos proprietários. Exemplos: SQL Jet no Access, SQL Plus no Oracle, SQL
Transact no SQL Server. O SQL aqui abordado passará essencialmente por demonstrar a
utilização do SQL Standard, que é reconhecido na totalidade em qualquer uma das plataformas
supra mencionadas. No entanto, isto não inviabiliza o facto de em algumas
situações/considerações ser feito uma menção a alguns comandos, ditos proprietários.
Aconselha-se, pois, a consultar a documentação nas plataformas que vier a utilizar para um
conhecimento mais detalhado e aprofundado da sintaxe em questão.
Como é sabido, uma tabela ou entidade num SGBDR é constituída por linhas (registos ou tuplos)
e colunas (campos ou atributos), em que as tabelas são identificadas inequivocamente através de
chaves primárias e, possivelmente, relacionadas entre si.
O SQL usa na sua sintaxe comandos para interagir com as BD, fazendo permanentemente
interrogações às mesmas. Estes comandos são designados por cláusulas.
Sintaxe geral:
Select campo1, campo2, …, campoN ou *
From tabela1, …, tabelaN
[Where condição]
[Group By…]
[Having…]
[Order By…]
Nota: O símbolo * representa tudo (todos os campos); os comandos entre [ ] são opcionais, pois
nem sempre estão presentes numa consulta. Se tivermos que utilizar todos estes comandos numa
consulta, a ordem sequencial dos mesmos terá que ser respeitada!
Vamos supor que temos definido numa base de dados as tabelas “Pessoa”, “Postal”, “Comissao”
e “Mensagem”, com as relações indicadas e constituídas pelos seguintes campos:
A ordem pela qual são enumerados os campos, assim como a sua escrita em
maiúsculas/minúsculas determina a forma de apresentação dos resultados listados.
Há dois conceitos que importa desde já explicar. Quando se fala de projecção, estamos
interessados em obter apenas algumas das colunas da(s) tabela(s). Quando se fala de restrição,
estaremos interessados em efectuar algum tipo de filtragem aos dados, restringindo o n.º de
linhas a mostrar/visualizar. Neste último caso, teremos que usar a cláusula “Where”.
Operadores Relacionais: =, >, <, >=, <=, <> ou != (diferente, em algumas versões de SQL).
Operadores Lógicos: And (E), Or (Ou), Not (Não).
Problemas:
1. Seleccionar todas as pessoas com menos de 35 anos de idade.
2. Seleccionar o nome e salário de todas as pessoas com idade para votar.
3. Seleccionar as pessoas com idades compreendidas entre os 30 e os 45 anos de idade.
4. Seleccionar as pessoas cujas idades não estão compreendidas entre os 30 e os 45 anos de
idade.
3. “Is”
Operador bastante utilizado no tratamento de nulos.
As BDR contêm um valor especial “NULL” que pode ser atribuído a qualquer tipo de dados. Esse
valor, quando presente num campo, indica a ausência de valor.
As comparações de valores com NULL são feitas com o operador “Is”.
Sintaxe:
Select ……..
From ………
Where campo Is [Not] Null
Problemas:
1. Seleccionar pessoas com idades compreendidas entre 20 e 50, utilizando o operador
“Between”.
2. Seleccionar os códigos postais completos de Lisboa e Porto.
3. Seleccionar os códigos postais completos que não sejam nem 1000, 4000 e 4760.
4. Seleccionar os nomes das pessoas que não possuem telefone.
5. Seleccionar os nomes das pessoas que possuem telefone.
6. Seleccionar todas as pessoas cujo nome começa por “J”.
7. Seleccionar todas as pessoas cujo nome contenha a palavra “Manuel”.
8. Seleccionar todas as pessoas cuja 2.ª letra do nome é um “a”.
A cláusula “Where” de cima é equivalente a: Where Idade <= 27 or (Idade >= 30 and Telef is Null).
Sintaxe:
Select ….
From ….
Order By campo1 [ASC | DESC], …, campoN [ASC | DESC]
Problemas:
1. Seleccionar todas as pessoas, ordenando o resultado pelo campo Idade.
2. Seleccionar o nome e o salário de todas as pessoas, ordenando o resultado pelos
salários mais elevados.
3. Seleccionar todo o conteúdo da tabela de Comissões, ordenado por ID e ID_MSG.
4. Seleccionar da tabela de Comissões, as linhas cujo ID é menor que 40, ordenadas,
dentro de cada ID, pela coluna valor de forma descendentemente.
Selecção de expressões
Podemos efectuar cálculos a nível de operações aritméticas na cláusula “Select”.
Exemplo:
1. Seleccionar o nome, idade actual e idade que irão ter daqui a 1 ano de todas as pessoas
registas na BD.
Select Nome, Idade, Idade+1 As [Idade para o ano]
From Pessoa
O operador “AS” é entendido como sendo uma aliase.
Problema:
1. Seleccionar da tabela de Comissões, o valor bruto a receber, o montante do IVA (23%) e o
valor líquido para os indivíduos cujo ID é igual a 14 e 25, ordenando o resultado pelo campo
ID.
A listagem obtida deverá ter o seguinte aspecto:
Eliminação de repetições
É possível em SQL eliminar linhas repetidas na visualização de registos, usando para o efeito a
palavra reservada “Distinct”. Os dados obtidos ficam automaticamente ordenados.
Exemplo:
Select Distinct Local
From Postal
Junção de tabelas
O “Join” (ligação) entre tabelas permite extrair, num único “Select”, qualquer informação contida
em diferentes tabelas.
A ligação entre tabelas é feita através de chaves primárias na origem e chaves estrangeiras no
destino. Recordando o conceito de chave estrangeira (“Foreign Key”): trata-se de um campo ou
conjunto de campos existentes numa tabela, que permite ligar os dados desta tabela a outra
tabela, onde este mesmo conjunto de campos existe como chave primária.
Sintaxe:
Select campo1, …, campoN, *
From tabela1, …, tabelaN
Tipos de Junções “Joins”
1. “Cross Join” (Produto Cartesiano): associa a cada linha de uma tabela o conjunto de linhas
de outra tabela. Nota: Pouco usado.
Exemplo:
Select *
From Pessoa, Postal
3. “Natural Join”: existe quando todas as colunas envolvidas na ligação entre as tabelas são
apresentadas sem repetição de colunas.
Exemplo:
Select Pessoa.*,Postal.Local
From Pessoa, Postal
Where Cod_Postal=Codigo
4. “Inner Join”: juntam-se duas ou mais tabelas, ligando-as através da chave primária de uma e
da chave estrangeira da outra. Os dois tipos anteriores fazem parte deste tipo de ligação.
Nota: O mais usado de todos.
Exemplo:
Select Nome,Cod_Postal,Local
From Pessoa, Postal
Where Cod_Postal=Codigo
Podíamos também substituir o campo “Cod_Postal” em cima pelo campo “Codigo”, visto as
duas tabelas estarem relacionadas através deles.
A junção de N tabelas num único “Select” obriga à colocação de, pelo menos, N-1 condições de
junção.
Problemas:
1. Seleccionar os nomes e as localidades das pessoas que não possuem telefone.
2. Seleccionar o ID das pessoas, seus nomes e valor de todas as comissões ganhas.
3. Seleccionar o nome das pessoas e o valor das comissões, ordenando o resultado pelo nome e
colocando os maiores valores de comissão no topo do resultado de cada indivíduo.
4. Seleccionar todas as comissões, o seu destinatário e a descrição da operação que reflectem.
O resultado deverá aparecer ordenado por nome.
5. “Outer Join”: permite que a totalidade das linhas de uma tabela seja obtida, ainda que não
exista o correspondente valor na outra tabela a que esta está ligada.
Exemplo: Todos os códigos postais e respectivas pessoas, mesmo para aqueles códigos que
não estejam associados a nenhuma pessoa em particular.
Select Nome, Cod_Postal, Codigo, Local
From Postal Left Join Pessoa
On Postal.Codigo=Pessoa.Cod_Postal
O “Outer Join” pode ser realizado à esquerda ou à direita, isto é, quando se faz a ligação entre
duas tabelas, irá mostrar-se respectivamente, todo o conteúdo da tabela da esquerda e
respectiva ligação à tabela da direita ou vice-versa.
Quando o “Outer Join” é realizado à direita, são considerados todos os registos da tabela da
direita e apenas os registos correspondentes na tabela da esquerda.
Exemplo:
Select Nome, Valor
From Comissao Right Join Pessoa
On Comissao.ID=Pessoa.ID
O n.º de campos a seleccionar em cada um dos comandos “Select” tem que ser igual. Se se
pretender juntar tabelas que não possuam o conjunto de campos necessário, devemos adicionar a
constante “Null” à selecção. O nome das colunas na listagem final, é o que resulta do 1.º “Select”.
Cada “Select” pode conter a sua própria cláusula “Where”, no entanto, só poderá existir uma única
cláusula “Order By” no último “Select”, sendo a ordenação aplicada a todo o resultado final. Por
defeito, um “Union” remove sempre as linhas duplicadas.
Problemas:
1. Juntar as tabelas “Postal” com os locais contendo a string “Ar” e “Mensagem”, com os
ID’s de mensagem <= 50. Ordenar o resultado pela coluna das descrições das
mensagens.
2. Unir o conteúdo da tabela “Postal” ao da tabela “Pessoa”.
Funções Agregadas
O uso de funções agregadas ou estatísticas permite obter informação sobre conjuntos de linhas
especificados na cláusula “Where” ou sobre grupos de linhas indicados na cláusula “Group By”.
Função Descrição
Count Devolve o n.º total de linhas (registos)
Max Devolve o maior valor de uma coluna
Min Devolve o menor valor de uma coluna
Sum Devolve a soma de todos os valores de uma coluna
Avg Devolve a média de todos os valores de uma
coluna
Problemas:
1. Quantas pessoas existem na BD?
2. Qual o n.º total de pessoas e quantas possuem telefone?
Agrupamento de informação
Os conceitos de agrupamento de dados são fundamentais na maior parte das consultas
efectuadas a Base de Dados Relacionais.
Vejamos os dois seguintes exemplos em que não existe qualquer tipo de agrupamento:
A cláusula “Group By” está ligada às funções de agregação, permitindo agrupar a informação e
obter valores estatísticos sobre os grupos formados.
Se um comando “Select” tiver a cláusula “Group By”, então todas as colunas seleccionadas terão
que estar presentes na cláusula “Group By”.
Exemplos:
1. Mostrar para cada ID, o valor total das comissões.
Select ID, Sum(Valor) As Total
From Comissão
Group By ID
2. Mostrar para cada pessoa, o valor total das comissões.
Select Nome, Sum(Valor) As Total
From Pessoa P,Comissao C
Where P.ID=C.ID
Group By Nome
Problemas:
1. Mostrar o valor total (salário+comissões) a receber por cada pessoa.
2. Seleccionar a maior comissão de cada ID.
3. Seleccionar o n.º de comissões de cada ID.
4. Mostrar o valor total e o n.º das comissões sobre “Vendas” a receber por cada pessoa,
indicando também o local onde essa pessoa vive.
Se num “Select” com a cláusula “Group By” não houver nenhuma função de agregação, então
estamos perante um “Select Distinct”.
Exemplo:
Select ID Select Distinct ID
From Comissao From Comissao
Group By ID
A cláusula “Having” permite aplicar restrições ao nível dos grupos que são processados.
Exemplo:
1. Mostrar o valor total de cada comissão agrupada por ID, seleccionando apenas os ID’s com
comissões totais maiores que 1000.
Select ID, Sum(Valor) As Total
From Comissao
Group By ID
Having Sum(Valor)>1000
Notas: Usa-se a cláusula “Where” sempre que se pretende restringir os registos a considerar na
selecção. Usa-se a cláusula “Having” para restringir o conjunto dos grupos de registos a
considerar.
Problemas:
1. Seleccionar o nome de todas as pessoas que tenham alguma mensagem com ID_Msg > 35.
2. Qual o total das comissões agrupadas por ID, considerando apenas aquelas de valor > 1000.
3. Qual o total das comissões agrupadas por ID, considerando apenas aquelas cujo valor total >
1000.
Ordenação de Grupos
Pode-se efectuar a ordenação por colunas, expressões ou pela ordem da coluna ou expressão
seleccionada.
Exemplos:
1. Ordenação por coluna
Select ID, Count(ID) As Conta
From Comissao
Group By ID
Order By ID
Sub-Consultas (“SubQuerys”)
O resultado do comando “Select” é sempre uma tabela, ainda que da sua execução não resulte
qualquer linha/registo.
Um “subquery” consiste num comando “Select” dentro doutro.
Um comando “Select” pode ser colocado:
dentro doutro nas cláusulas “Where”, “Having”, “Select” e “From”;
nos comandos “Insert”, “Upate” e “Delete” que iremos ver mais à frente;
na definição de vistas (“Views”), que iremos também ver mais à frente.
Exemplo:
1. Qual o nome da pessoa que aufere o menor salário?
Select Nome
From Pessoa
Where Salario=(Select Min(Salario) From Pessoa)
Quando um “Select” contém outro “Select” encadeado, por vezes, pode acontecer que o “Select”
interior necessite de valores do “Select” exterior.
Exemplo:
1. Qual o nome das pessoas cujo salário é menor que 15 vezes o conjunto das suas comissões?
Select Nome,Salario
From Pessoa P
Where Salario<15*(Select Sum(Valor) From Comissao C Where C.ID=P.ID)
Para cada pessoa estudada no “Select” exterior, é executado o “Select” interior calculando o total
das comissões que lhe estão associadas.
Ao “Select” exterior chama-se “Outer Select”.
Ao “Select” interior chama-se “Inner Select”.
A sub-query (colocada entre parêntesis) que depende, para o seu funcionamento, de valores da
query mais exterior chama-se “Query correlacionada”. Se não depender, diz-se que é não
correlacionada.
A utilização de operadores lógicos e relacionais na comparação com o resultado duma subquery
obriga a que esta última devolva apenas uma única linha de resultado. Caso contrário, obtém-se
um erro.
Exemplos:
1. Seleccionar o nome das pessoas que vivem na localidade com o maior código postal.
Select Nome
From Pessoa
Where Cod_Postal=(Select Max(codigo) From Postal)
O operador “In”
Verifica se um valor existe no resultado duma subquery, devolvendo “True” ou “False”.
Exemplo:
1. Qual o conjunto de pessoas que vivem em Lisboa?
Select Nome, Cod_Postal
From Pessoa
Where Cod_Postal In (Select Codigo From Postal Where Local=’Lisboa’)
O operador “Exists”
Só pode ser usado para avaliar o resultado de subqueries; o seu objectivo é verificar se, da
execução da subquery, resultou ou não alguma linha de resultado, devolvendo “True” ou “False”.
Sintaxe:
Select ….
From …..
Where [Not] Exists (Subquery)
Exemplos:
1. Seleccionar o nome e a morada completa de todas as pessoas que têm comissões a receber.
a. Usando a junção de tabelas:
Select Distinct Nome, Cod_Postal, Local
From Pessoa,Postal,Comissao
Where Cod_Postal=Codigo and Comissao.ID=Pessoa.ID
From Pessoa,Postal
Where Cod_Postal=Codigo and ID In (Select ID From Comissao Where ID=Pessoa.D)
Se colocarmos Not Exists, obteremos aqueles que não têm qualquer comissão a receber.
Exemplos:
1. Seleccionar todos os códigos e respectivas localidades que não estão associados a nenhuma
pessoa.
Select *
From Postal
Where Not Exists (Select * From Pessoa Where Cod_Postal=Codigo)
2. Seleccionar todas as linhas da tabela “Postal” cujo código é menor ou igual que 5000 e
simultaneamente maior ou igual que 3000.
Select *
From Postal P
Where Codigo<=5000 and Exists (Select * From Postal Where Codigo>=3000 and
Codigo=P.Cod_Postal)
Ou
Select Nome,Idade
From Pessoa
Where Cod_Postal = Any (Select Codigo From Postal Where Local<>’Lisboa’)
Nota: As colunas que não forem colocadas no comando “Insert” são preenchidas com o valor
“Null”.
Cuidados a ter:
Manter a compatibilidade de tipos de dados;
Manter o n.º de colunas iguais.
Exemplo:
1. Inserir na tabela “Postal”, o ID e Nome de todas as pessoas (algo estranho, mas que
comprova este facto) => Já funciona no SQL Server 2005
Insert Into Postal(Codigo,Local) Insert Into Postal
Select ID, Nome Select ID As Codigo, Nome As Local From Pessoa
From Pessoa
Cuidados a ter:
Manter o n.º de colunas igual;
Manter compatibilidade de tipos de dados;
O comando “Select” não pode conter a tabela em que se está a fazer a inserção.
Actualização de registos
Sintaxe:
Update tabela [Aliase]
Set campo1={expressão1,query1},
.
.
campoN={expressãoN,queryN}
[Where condição]
Exemplo:
1. Aumentar o salário 10% a todas as pessoas
Update Pessoa
Set Salario=Salario*1.1
Problemas:
1. Aumentar o salário 20% ao “Paulo Viegas” e adicionar mais 1 ano à sua idade.
2. Adicionar o prefixo “1” ao telefone de todas as pessoas que têm telefone e que vivem em
Lisboa.
Eliminação de registos
Apaga linhas completas duma determinada tabela.
Sintaxe:
Delete From Tabela
[Where condição]
Problemas:
Nota: Atenção à Integridade Referencial! Cuidado ao remover as linhas da tabela “Postal” que
possuem códigos postais associados na tabela “Pessoa”.
Manipulação de datas
Cada um dos diferentes SGBDR representa e manipula de forma distinta datas e horas.
Exemplos:
Inserir uma data de nascimento (2/Julho/1979) numa tabela:
Insert Into Tabela(Num,Nome,Data_Nasc) Values (1,’Carlos Sousa’,#07/02/1979#) => Access
Insert Into Tabela(Num,Nome,Data_Nasc) Values (1,’Carlos Sousa’,’02 Jul 1979’) => SQLServer
O ficheiro vai ter o nome lógico de “mydb_dat” no caso de ser preciso referenciá-lo num script de
SQL mais tarde.
Notas: Apesar desses utilitários fornecerem ambientes gráficos amigáveis, existem situações em
que é absolutamente necessário efectuar a criação da BD através de um Script (ficheiro externo
com comandos de SQL), incluindo muitas vezes a criação das tabelas, índices e mesmo o
eventual carregamento de dados.
Exemplo:
DROP DATABASE mydb
Alguns sistemas não disponibilizam este comando.
Exemplo:
Create Table Empregado(ID int, Nome text, DataNasc datetime, Salario float)
Tipos de dados
Strings;
Numéricos;
Data e Hora.
Vejamos de seguida alguns dos principais tipos de dados encontrados na maioria dos SGBDR.
Algumas questões que se colocam relativamente às características dos campos duma tabela são:
Logo:
Insert Into Postal(Local) Values(‘Faro’) Insert Into Postal Values(Null,‘Faro’)
Exemplo:
Create Table Teste3(BI int Constraint BI Unique)
Exemplos:
Create Table Teste4(ID Int Constraint Chave1 Primary Key, Nome Char(50))
Create Table Comissao2(ID int not null, ID_Msg int not null, Valor float not null, Constraint Chave2
Primary Key(ID,ID_Msg))
Exemplo:
Create Table Funcionarios(Cod_Postal smallint References Postal(Codigo))
O que é que acontece quando tentarmos apagar ou alterar os valores duma chave primária que
tem dados associados noutra(s) tabela(s)?
Se não houver qualquer ligação entre as tabelas através da cláusula “References”, então as
alterações na tabela “Mãe” não se reflectem na tabela “Filho”.
Se existir uma ligação entre as duas tabelas, então o sistema não vai permitir que os valores da
tabela mãe sejam alterados ou apagados, se estes existirem em qualquer tabela filho.
No entanto, por vezes interessa que, ao alterar um valor (chave primária) numa tabela, sejam
alteradas todas as ocorrências desse mesmo valor nas tabelas filhos ou, então que, ao apagar o
valor na tabela mãe, sejam apagados todos os valores existentes nas tabelas filhos.
Problemas:
1. Adicionar à tabela “Pessoa” a coluna “Fax” com 15 caracteres.
2. Alterar o tipo de dados da coluna “Fax” para 25 caracteres.
3. Alterar as características da coluna “Salario”, de forma a que esta possa admitir nulos.
4. Eliminar a coluna “Fax”.
Sintaxe:
Create View nomevista [(lista de campos)] As
Select …
From …
[Where condição]
O nome dos campos da “View” são, por defeito, iguais aos nomes dos campos das tabelas a que
pertencem. Uma visão pode ser criada a partir de tabelas ou de outras views.
Exemplos:
1. Criar uma visão com o conjunto das pessoas cujo salário é menor que 10000.
Create View Salários AS
Select ID, Nome, Salario
From Pessoa
Where Salario < 10000
Criação de Índices
Os registos, quando adicionados ao ficheiro ou à BD, são sempre colocados no fim do mesmo.
Evita-se desta forma pesadas reorganizações dos sistemas do ficheiro sempre que um novo
registo é introduzido. Sendo os registos colocados sempre no final do ficheiro ou da tabela, outra
forma qualquer terá que existir para simular uma ordenação sobre os dados.
A indexação é a estrutura que permite essa simulação. Consiste numa árvore de termos que
revertem para uma determinada posição no ficheiro ou tabela.
Uma árvore binária é uma estrutura em que, para cada um dos nós da árvore, todos os nós à
esquerda são menores ou iguais à chave de indexação e todos os nós à direita são maiores que a
chave de indexação. Em cada um dos nós vai-se guardar a chave de indexação e a posição no
ficheiro ou o n.º de registo.
ID Nome Apelido
Célia
2456 Célia Morais 1
A maioria dos SGBDR inclui utilitários que criam índices de forma visual.
Sintaxe:
Create [Unique] Index nomeíndice On Tabela(campo1{Asc|Desc}, …)
Exemplo:
1. Criar um índice sobre o campo “Local” da tabela “Postal”.
Create Index ILocal On Postal(Local)
Problemas:
1. Criar um índice único sobre o campo “Nome” da tabela “Pessoa”.
2. Criar um índice descendente sobre o campo “Salario” da tabela “Pessoa”.
3. Criar um índice único sobre os campos ID e ID_Msg da tabela “Comissoes”.
É possível a criação de índices sobre campos que são de tipos de dados diferentes. Os índices
são automaticamente actualizados pelo SGBDR cada vez que um registo indexado é inserido,
alterado ou eliminado. É de referir ainda que os índices existem fisicamente em disco.
Eliminação de índices
Sintaxe:
Drop Index NomeÍndice on Tabela
Exemplos:
1. Drop Index ILocal On Postal
2. Drop Index INome On Pessoa