Fundamentos de Base de Dados
Paulo Gabriel Soares
Relacional - Índice
Relação Especificação de Atributos
Produto Cartesiano Optimizações
Definição de Relação Índices
Chave Primária Arquivo
Critérios para adopção de Chave Primária Parameterização
Chave Estrangeira Transacções
Integridade da Chave Estrangeira Concorrência
Joins
Transposição a partir do UML
Modelo Relacional
(Codd, 1970)
No Modelo relacional a informação é representada através de
relações (ou tabelas). As relações correspondem a conjuntos,
ou seja, são manipuladas através dos habituais operadores que
operam sobre conjuntos: Intersecção, Produto Cartesiano,
União, etc..
Relação
Uma Base de Dados relacional é um conjunto de relações com
um número específico de atributos (colunas) e um número
variável de tuplos (linhas ou instâncias). A cada atributo é
atribuído um domínio (conjunto de valores válidos) e um nome
único na relação
Relação: Cliente
Um valor é armazenado na
Número Nome Morada
intersecção entre uma linha e um
001 João NULL atributo e diz respeito ao domínio
013 Ana NULL do atributo ou tem o valor NULL
056 Luís NULL
(ausência de valor).
INT (inteiros)
Domínios STR (caracteres)
Produto Cartesiano
O Produto Cartesiano é obtido através de todas as combinações
entre os elementos dos conjuntos.
Exemplo
Domínio D1={0,1}
a c Domínio D2 ={A,B,C}
0
1 b Representação Relacional
DI D2
0 a
0 b
Produto Cartesiano (D1 X D2) =
0 c
{(0,A), (0,B), (0,C), (1,A), (1,B), (1,C)} 1 a
1 b
1 c
Definição de Relação
Uma relação é o subconjunto do Produto Cartesiano de
uma lista de domínios. A tabela de clientes é um subconjunto
do produto cartesiano entre os domínios INT e STR,
nomeadamente INT X STR X STR.
Número Nome Morada Qualquer subconjunto de INT X
001 João NULL STR X STR é uma tabela
(inclusive INT X STR X STR ou
013 Ana NULL
INT X STR).
Um conjunto não é ordenado. Isto é, caso seleccione elementos
de um conjunto (e.g., linhas de uma tabela) sem indicar uma
forma de ordenação, os elementos são seleccionados através de
uma ordem aleatória.
Chave Primária (I)
Todas as tabelas têm de possuir uma chave primária.
Chave Primária (ou chave): conjunto minimal de atributos que
permitem identificar univocamente uma tuplo de uma relação.
Número Nome Morada
O conjunto {Número} é chave
porque não podem existir dois 001 João NULL
clientes com o mesmo número. 013 Ana NULL
O conjunto {Nome} não é chave porque podem existir dois
clientes com o mesmo nome.
O conjunto {Número, Nome} não é chave porque não é minimal
(contém uma chave), e designa-se por Super-Chave.
Modelo Relacional
Chave Primária (II)
Sala de Cinema
Apenas o conjunto {Fila, Lugar} Fila Lugar Ocupado?
garante que identificamos
A 1 sim
apenas uma linha.
A 1 não
B 1 não
Cliente
Número Nome Morada BI
001 João NULL 1234567
013 Ana NULL 7654321
É obrigatório
Chaves Candidatas (ou Alternativas) optar por uma
única chave !
Critérios para adoção de uma Chave Primária (I)
• Atributos familiares ao utilizador
• Domínio Numérico (por razões de eficiência)
• Apenas um atributo (por razões de eficiência)
• Preenchimento Obrigatório
Critérios para adoção de uma Chave Primária (II)
Livro
Título Editora Edição ID
Database Systems Addison Wesley 5 OO1
Database Systems Addison Wesley 6 002
UML, User Guide Addison Wesley NULL 003
Alternativa a {Título, Editora, edição}
Apesar de familiar, é pouco eficiente e obriga ao
preenchimento de Edição
Chave Estrangeira (I)
As chaves estrangeiras ocorrem quando existem dependências
entre domínios.
Cliente Fatura
Número Nome Morada Número Data Cliente
001 João NULL 001 12-12-1999 001
013 Ana NULL 002 01-03-2000 013
056 Luís NULL 0003 02-03-2000 001
O domínio de [Link] não é INT, mas sim: o conjunto
de valores da coluna Cliente.Número. Ou seja, uma fatura não
pode estar associada a um cliente (Número) que não conste na
tabela Cliente.
Chave Estrangeira (II)
[Link] é Chave Estrangeira na tabela Fatura.
Cliente Fatura
Número Nome Morada Número Data Cliente
001 João NULL 001 12-12-1999 001
013 Ana NULL 002 01-03-2000 013 Dependência
056 Luís NULL 0003 02-03-2000 001
1 0...*
Cliente.Número não é Chave Estrangeira porque podem
existir clientes sem faturas. A existência de um cliente
não é condicionada à existência de faturas.
Chave Estrangeira (III)
Cliente Localidade
Número Nome CodPostal CodPostal Localidade [Link] é Chave
001 João 1500 1500 Lisboa Estrangeira porque aos
013 Ana 2100 2100 Porto clientes não podem ser
056 Luís NULL 3999 Évora atribuídos códigos postais que
0...* 0 ... 1 não constem na tabela de
localidades.
Mas não é obrigatório atribuir
um Código Postal a um cliente.
[Link] {[Link]} NULL
Integridade das Chaves Estrangeiras
(Operação Delete)
Cliente Localidade
Número Nome CodPostal CodPostal Localidade
001 João 1500
Hipótese: um utilizador
1500 Lisboa
pretende apagar a linha cujo
013 Ana 2100 2100 Porto
CodPostal é 2100
056 Luís NULL 3999 Évora
Dado que [Link] {[Link]} NULL,
três alternativas se colocam ao gestor da base de dados:
1. Não permite apagar; (Restricted)
2. Permite apagar, mas apaga o cliente 013; (Cascate)
3. Permite apagar, mas substitui o CodPostal do cliente 013 por NULL.
(Set Null)
Integridade das Chaves Estrangeiras
(Operação Update)
Cliente Localidade
Número Nome CodPostal CodPostal Localidade
001 João 1500
Hipótese: um utilizador
1500 Lisboa
pretende alterar o CodPostal
013 Ana 2100 2100 Porto
2100 para o valor 2200
056 Luís NULL 3999 Évora
Dado que [Link] {[Link]} NULL,
três alternativas se colocam ao gestor da base de dados:
1. Não permite alterar; (Restricted)
2. Permite alterar, mas altera igualmente o código postal do cliente 013
(de 2100 passa também para 2200); (Cascate)
3. Permite alterar, mas substitui o CodPostal do cliente 013 por NULL.
(Set Null)
Cruzamento de Informação
No Modelo Relacional a informação é obtida através do cruzamento entre
tabelas (produtos cartesianos) através das chaves estrangeiras. Trata-se de
uma forma fácil e intuitiva de obter informação, mas pouco eficiente.
Exemplo: Listar informação de clientes (incluindo localidades)
Cliente
Número Nome CodPostal Número Nome CodPostal Localidade
001 João 1500 001 João 1500 Lisboa
013 Ana 2100 013 Ana 2100 Porto
056 Luís NULL X 056 Luís NULL NULL
Localidade
CodPostal Localidade Para cada [Link] procura-se um
1500 Lisboa [Link] idêntico e selecciona-
2100 Porto
se a localidade respectiva.
3999 Évora
Joins
A informação obtida unicamente através do produtos cartesiano entre
tabelas é inconsistente, daí a necessidade de efectuar Joins.
Cliente Número Nome Cliente. Localidade. Localidade
CodPostal CodPostal
Número Nome CodPostal 001 João 1500 1500 Lisboa
001 João 1500 001 João 1500 2100 Porto
013 Ana 2100 001 João 1500 3999 Évora
056 Luís NULL X= 013 Ana 2100 1500 Lisboa
Localidade 013 Ana 2100 2100 Porto
CodPostal Localidade 013 Ana 2100 3999 Évora
1500 Lisboa 056 Luís NULL 1500 Lisboa
2100 Porto 056 Luís NULL 2100 Porto
3999 Évora 056 Luís NULL 3999 Évora
Únicas linhas coerentes: Chave Primária = Chave Estrangeira
(Key Join)
Transposição Modelo de Classes / Relacional
A transposição do modelo de classes para o modelo relacional tem como
objectivo final a criação de uma base de dados coerente com a modelação
da fase de análise.
As regras asseguram que
1) não ocorre perca de informação, ie., é possível aceder a toda a
informação;
2) não existe informação redundante
As regras apresentadas não devem ser interpretadas como “leis” rígidas de
transposição, mas uma indicação susceptível de adaptação em função da
análise do problema em questão. As regras usualmente geram modelos
relacionais ineficientes.
Na transposição existe perca de informação semântica relativa às relações
entre as classes: a partir de um modelo relacional pode não ser possível
obter o Diagrama de Classes a partir do qual ele foi gerado.
Especificação de Atributos
Na especificação dos atributos, para além da sua designação e
tipo de dados, é possível indicar outras propriedades:
• Chave primária;
• Chave Estrangeira
• Allow NULLS – admite o valor null
• Unique – admite valores duplicados
• Validações (CHECK) – regras simples com operadores
lógicos (<,>,<>, or, and) e.g., IN (lista de valores);
• Valor por omissão;
• Comentários.
Otimizações do Modelo Relacional
As regras de transposição, apesar de assegurarem um modelo
completo (sem perca de informação) e coerente, geram
usualmente modelos ineficientes. Sempre que possível (desde
que não haja perca de informação relevante) dever-se-à
optimizar o modelo relacional obtido, nomeadamente, no que
diz respeito a:
a) Número de tabelas (um elevado número de tabelas – joins
– pode comprometer a eficiência do modelo;
b) Número de atributos que compõem a chave das tabelas
(deve ser reduzido).
Ao contrário de um diagrama de classes, o modelo relacional
não pretende ser descritivo, mas sim eficaz e eficiente.
Índices (I)
Uma técnica habitual de otimização de interrogações (querys)
a bases de dados consiste na utilização de índices. O objetivo é
acelerar o acesso a uma tabela através de um campo.
Hipótese: é frequente consultar-se as publicações pelo assunto
Ficheiro de Índice Tabela de Publicação
Assunto Índice ISBM Título Data Assunto
Direito 1 A 1998 História
História 2 D 1997 Informática
Informática 3 C 1994 Sociologia
Informática 4 Z 2000 Informática
Sociologia 5 F 1986 Direito
Ordenado por assunto
Índices (II)
Ficheiro de Índice Tabela de Publicação
Assunto Índice ISBM Título Data Assunto
Direito 1 A 1998 História
História 2 D 1997 Informática
Informática 3 C 1994 Sociologia
Informática 4 Z 2000 Informática
Sociologia 5 F 1986 Direito
Exemplos de interrogações que beneficiam do índice
1. Quais os títulos das publicações de História ? (mesmo que a maioria das publicações sejam
de história, é mais rápido percorrer sequencialmente um ficheiro mais pequeno);
2. Quantas publicações de informática existem (apenas necessita de abrir o ficheiro de índices);
3. (campo data indexado) Quais os títulos entre 1990 e 1998 ? (a ordenação do índice acelera
muito a procura por intervalos).
Índices (III)
É usual criar-se um índice para a chave primária dado que a
forma privilegiada de acesso às tabelas é através da chave, e.g.,
joins).
Pela mesma razão também por vezes se opta por criar índices
para as chaves estrangeiras.
Pode ser criado um índice para dois ou mais atributos.
Ficheiro de Índice Tabela de Publicação
Assunto/Data Índice ISBM Título Data Assunto
Direito+1986 1 A 1998 História
Informática+1997 2 D 1997 Informática
3 C 1994 Sociologia
4 Z 2000 Informática
5 F 1986 Direito
Índices (IV)
Apesar de acelerarem a consulta de informação, os índices
penalizam a introdução e alteração de informação.
A inserção de um registo obriga à introdução de um registo
(ordenado) na tabela de índices. A alteração de um valor num
atributo indexado obriga ao reordenamento do ficheiro de
índices.
A gestão de índices é fundamental mas perigosa (uma má gestão
– excesso – pode degradar muito o desempenho da base de
dados) e nunca é definitiva. Depende do número de registos
existentes e no tipo de acessos (consultas) mais frequentes.
Índices (V)
Exemplos de acessos
Tabela: Publicacao (ISBN (Int), Assunto (Str), Ano (Int), Titulo (Str))
100.000 registos
Inserção: ISBN sequencial, restantes 3 aleatórios
Consulta: Número de publicações com um determinado assunto
Valores em segundos
Índice Inserção Consulta
Nenhum 398 2
ISBN 402 2
ISBN, Assunto 547 (+37%) 0
Parametrização
Todas as constantes de uma aplicação devem estar em uma(s)
tabela, e nunca no código. Normalmente essa tabela apenas contém
uma linha e uma coluna para cada parâmetro da aplicação.
Exemplos de atributos:
Taxa IVA;
Designação e Morada da Empresa (para impressões);
Dia do mês em que são automaticamente processados os salários;
Prazo de devolução de uma publicação (biblioteca);
etc.
Transações (I)
Exemplo: Transferências entre contas bancárias
CONTA CONTA
A B
BD
Inconsistente
IDébito 100 Crédito 100
Falha no sistema
Necessidade de executar as duas operações como um todo.
Transação: conjunto delimitado e pré-definido de operações que exibe as seguintes
características:
• Atomicidade - grupo indivisível (todas ou nenhuma);
• Integridade - passar de um estado de integridade da BD para outro estado de
integridade;
• Isolamento - uma transação deve ser executada como se fosse única. Ou seja,
num ambiente concorrente não pode haver interferências entre as transações, o
resultado final é equivalente a uma execução em série (não concorrente).
Transações (II)
Flat Transactions
Start Transaction
….
Operações de escrita na BD
[COMMIT, ROLLBACK]
…
End Transaction
COMMIT – atualização permanente na BD das alterações efetuadas desde o ultimo
commit ou início de transação.
ROLLBACK – desfaz todas as alterações desde o último commit ou início de
transação.
O End Transaction faz automaticamente o COMMIT. Caso a transação termine
abruptamente antes do End Transaction é feito automaticamente o ROLLBACK.
Nem sempre é adequado. Por exemplo, situações do tipo Update a milhares de
registos (caso a transação falhe a meio, o ROLLBACK desfaz tudo desde o início).
Modelo Relacional
Exemplos de Interrogações
1 ”Listar o nome e nacionalidade dos autores de nacionalidade
Portuguesa e Brasileira”
nome, nacionalidade (nacionalidade =”Portuguesa” or nacionalidade =”Brasileira”
(Autor))
2 ”Listar os títulos dos livros do Gabriel Garcia Marquez”
titulo (nome Like ”Gabriel*” ((Autor X Autoria) X Livro))
3 ”Listar o nome dos autores, indicando os títulos dos seus livros”
a) nome, titulo ((Autor X Autoria) X Livro)
incorrecto, não selecciona os autores sem livros
b) nome, titulo (Autor X OUTER LEFT JOIN (Autoria X Livro)
SQL - Índice
Domínios e Tipos de Dados SELECT
Tabelas Cláusula SELECT
Cláusula FROM
Índices
Joins
DML (Data Manipulation Language )
Cláusula WHERE
Prepared Statements Cláusulas GROUP BY, HAVING
Stored Procedures e funções de agregação
UNION
Triggers
UPDATE
DELETE
INSERT
Optimização de Querys
Views
Linguagem SQL
Norma ANSI criada em 1986 (revista em 1989 e 1992).
A linguagem SQL tem duas vertentes: DDL (Data Definition
Language) e DML (Data Manipulation Language). Na vertente
DDL o SQL possui um conjunto de comandos para criação e
alteração de tabelas, chaves estrangeiras, regras de integridade
referencial e views. A vertente DML é uma implementação da
Álgebra Relacional, e.g., permite efectuar interrogações a uma
base de dados, bem como alterar, anular ou inserir registos em
tabelas.
Domínios e Tipos de Dados (DDL)
Em SQL é possível especificar o domínio (tipo de dados) de um
atributo. Através da cláusula DOMAIN é possível definir um
domínio genérico ao qual podem ser atribuídos vários atributos. O
seguinte comando define o domínio morada:
CREATE Datatype dm_morada VARCHAR(100);
Alguns Tipos de Dados
Texto Número
Char [(n)] (equivalente a Varchar (n)) Tinyint [0 – 255]
Long Varchar - infinitos caracteres Smallint [-+ 32,767] ou
Text – eq. a Long Varchar mas admite NULL UNSIGNED [0 - 65535]
Integer [-+ 2,147,483,6479]
Boleano Double [ grande]
Bit [0, 1] Decimal (inteiros[, decimais])
Data
Date
Time
TimeStamp (data e hora)
Tabelas (DDL) (I)
Comando para criar uma tabela:
CREATE TABLE nome databela (definição das colunas,
restrições de integridade)
CREATE Datatype dm_morada VARCHAR(100);
CREATE TABLE Cliente (
cod_cliente INTEGER NOT NULL,
bi INTEGER NOT NULL,
nome VARCHAR(100),
morada dm_morada,
CONSTRAINT prim_key PRIMARY KEY (cod_cliente),
CONSTRAINT cand_key UNIQUE (bi));
Chave alternativa
Tabelas (II)
CREATE TABLE Factura (
num_factura INTEGER NOT NULL,
data DATE NOT NULL,
valor DECIMAL(10,2) NOT NULL,
cod_cliente INTEGER NOT NULL,
CONSTRAINT prim_key PRIMARY KEY (num_factura),
CONSTRAINT for_key_cliente
Chave
FOREIGN KEY (cod_cliente)
Estrangeira
REFERENCES Cliente (cod_cliente)
ON UPDATE CASCADE
ON DELETE RESTRICT);
Valor por omissão
CREATE TABLE Produto (
cod_produto INTEGER NOT NULL,
tipo CHAR(2) DEFAULT 'MP‘ CHECK (tipo IN ('MP','PA')) NOT NULL,
Designação VARCHAR(100),
CONSTRAINT prim_key PRIMARY KEY (cod_produto)); Restrições
Tabelas (III)
CREATE TABLE Item (
num_factura INTEGER NOT NULL,
num_item INTEGER CHECK (num_item between 1 and 10) NOT NULL,
quantidade INTEGER CHECK (quantidade > 0) NOT NULL,
valor DECIMAL (4,2) NOT NULL,
cod_produto INTEGER NOT NULL, Restrições
CONSTRAINT prim_key PRIMARY KEY (num_factura, num_item),
CONSTRAINT for_key_factura
FOREIGN KEY (num_factura)
REFERENCES Factura (num_factura)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT for_key_produto
FOREIGN KEY (cod_produto)
REFERENCES Produto (cod_produto)
ON UPDATE CASCADE
ON DELETE RESTRICT);
Tabelas (IV)
Comando para alterar uma tabela:
ALTER TABLE nome databela
alterações
ALTER TABLE cliente
ADD COLUMN telefone VARCHAR (10)
DROP COLUMN bi;
Comando para alterar uma tabela:
DROP TABLE nome databela
Nota: É conveniente ter um ficheiro com a definição completa da base de dados. Esse
ficheiro pode ser executado sempre que seja necessário reconstruir a base de dados. O uso
sistemático dos comandos ALTER e DROP TABLE pode dificultar a reconstrução da
base de dados.
Índices
Comando para criar um índice tabela:
CREATE [UNIQUE] INDEX nome índice ON nome tabela
(nome coluna [ASC | DESC])
create unique index Index_Key on Medicamentos_Receita (
Codigo ASC,
ID_Receita ASC
);
DML Linguagem para Manipulação de Dados
SELECT
Cláusula SELECT
Cláusula FROM
Joins
Cláusula WHERE
Cláusulas GROUP BY, HAVING
e funções de agregação
UNION
UPDATE
DELETE
INSERT
Optimização de Querys
Views
Comando SELECT
Um comando SQL típico para selecção de linhas obedece à seguinte
estrutura (em que a cláusula SELECT corresponde à projecção, a
cláusula FROM ao produto cartesiano e a cláusula WHERE à
selecção):
SELECT campos a seleccionar
FROM tabelas onde constam os campos indicados em Select
WHERE expressão lógica que indica quais as linhas que pretendemos
seleccionar
ORDER BY campo pelo qual a listagem virá ordenada;
SELECT Nome, Morada Lista o nome e morada de uma
FROM Cliente tabela de clientes, mas apenas os
WHERE Cod_Postal = 1300
ORDER BY Nome; clientes cujo código postal seja
1300 (ordenado por nome)
Nota
É importante notar que qualquer comando SELECT devolve uma
tabela (um conjunto de colunas e linhas).
Sempre que, no contexto da sintaxe da linguagem SQL for referida
uma tabela, ela deve ser interpretada no sentido mais lato: uma
tabela original (definida no esquema relacional) ou um comando
SELECT.
SELECT – Cláusula SELECT (I)
Qualquer expressão sintaticamente válida pode ser argumento da
cláusula SELECT. Por exemplo, os dois seguintes comandos são
válidos:
SELECT Produto, Quantidade * Preço FROM Item; (devolve duas colunas
em que a segunda corresponde ao produto das colunas quantidade e preço);
SELECT ‘teste’ FROM Item; (se a tabela item tiver 20 linhas, o comando devolve
20 vezes a palavra teste).
Podem ser atribuídos aliases (sinónimos) às colunas. Por exemplo o
comando anterior poderia ser escrito da seguinte forma (permite dar
um nome – Total - à segunda coluna devolvida):
SELECT Produto, Quantidade * Preço AS Total FROM Item;
SELECT – Cláusula SELECT (II)
Caso pretendamos visualizar todos os campos de uma tabela, como
alternativa a enumerá-los todos, pode-se usar a constante *:
SELECT * FROM Item;
Caso pretendamos eliminar duplicados na listagem obtida, utiliza-se
a cláusula DISTINCT (elimina linhas duplicadas)
SELECT DISTINCT CodPostal FROM Aluno; (devolve os códigos postais
existentes)
Caso se pretenda listar dois atributos com o mesmo nome
(correspondentes a duas tabelas referidas na cláusula FROM) é
necessário preceder o nome do campo pelo nome da tabela de onde
ele é originário.
SELECT – Cláusula SELECT (III)
Caso pretendamos apenas visualizar algumas linhas de uma tabela:
SELECT FIRST * FROM Item;
SELECT TOP 3 * FROM Item;
Caso pretendamos armazenar o resultado em variáveis (apenas
quando o comando apenas devolve uma linha)
SELECT Max(Quantidade) INTO Maximo FROM ITEM;
A cláusula INTO apenas se justifica quando o SQL é utilizado dentro de outra
linguagem de programação (Java, C, Visual Basic, etc.) ou em Stored Procedures
(ver mais adiante). Na cláusula INTO podem-se referir várias variáveis (o mesmo
número das expressões da cláusula SELECT).
SELECT – Cláusula FROM (I)
Na cláusula FROM indicam-se os nomes das tabelas envolvidas na
interrogação, separadas por vírgulas. Quando existe mais que uma
tabela o SQL executa automaticamente um produto cartesiano entre
as tabelas. Por exemplo, o seguinte comando executa um produto
cartesiano entre as tabelas Cliente e Localidade, devolvendo todos os
campos (das duas tabelas):
SELECT * FROM Cliente, Localidade;
Caso queiramos obter um JOIN é necessário explicitar a forma como
o pretendemos obter, por exemplo:
SELECT * FROM Cliente INNER JOIN Localidade;
SELECT * FROM Cliente LEFT OUTER JOIN Localidade;
SELECT – Cláusula FROM (II)
Á semelhança dos sinónimos dos atributos, é possível atribuir
aliases às tabelas (os sinónimos nas tabelas são relevantes nas
subquerys, analisadas mais adiante):
Select * From Cliente AS Cliente_Empresa;
Existe uma tabela de sistema que apenas contém uma linha
denominada DUMMY. Ela pode ser utilizada quando pretendemos
listar uma expressão que não é obtida a partir de nenhuma tabela.
SELECT COS(1) FROM DUMMY;
Devolve o cosseno de 1
SELECT – JOINS (I)
Tipos de JOINS
Key Join SELECT * FROM Cliente KEY JOIN Localidade;
Critério: chave estrangeira. Apenas funciona se existir uma (e apenas uma)
chave estrangeira a ligar as duas tabelas.
Natural Join SELECT * FROM Cliente NATURAL JOIN Localidade;
Critério: atributos com o mesmo nome. Apenas funciona se existir pelo menos
um atributo com o mesmo nome e tipo de dados compatíveis.
Join com Comparações
SELECT * FROM Cliente JOIN Localidade
ON Cliente.Cod_Postal = Localidade.Cod_Postal;
Critério: indicado explicitamente no comando através do ON. É o mais flexível.
SELECT – JOINS (II)
INNER, LEFT OUTER e RIGHT OUTER JOIN
Podem ser utilizados nos Key, Natural e ON Join. Quando nada
é indicado é efectuado um INNER Join.
SELECT * FROM Cliente NATURAL INNER JOIN Localidade;
SELECT * FROM Cliente NATURAL LEFT OUTER JOIN Localidade;
SELECT * FROM Cliente KEY RIGHT OUTER JOIN Localidade;
SELECT * FROM Cliente LEFT OUTER JOIN Localidade
ON Cliente.Cod_Postal = Localidade.Cod_Postal;
SELECT – Cláusula WHERE (I)
Na cláusula WHERE pode constar qualquer expressão lógica. A
expressão é avaliada linha a linha, isto é, para cada linha o SQL
avalia o valor da expressão, caso seja verdadeira devolve a linha.
SELECT * FROM Cliente Where CodPostal > 1000
AND CodPostal < 2000;
SELECT * FROM Cliente Where (CodPostal > 1000
AND CodPostal < 2000) OR CodPostal = 3000;
Select * FROM CodPostal WHERE 1 = 1; (devolve todos os registos)
SELECT – Cláusula WHERE (II)
Os principais operadores utilizados na cláusula WHERE são: =, <, >, >=, <=, <>,
AND, OR, NOT, IN, LIKE, BETWEEN e ISNULL. O operador IN é verdadeiro
quando um elemento faz parte de um conjunto. O operador permite a utilização de
wildcards. O operador ISNULL permite lidar com valores NULL. Alguns
exemplos:
SELECT * FROM CLIENTE WHERE CodPostal BETWEEN 1000,2000;
SELECT * FROM CLIENTE WHERE Nome LIKE ‘João%’ (todos os clientes
começados por João)
SELECT * FROM Cliente WHERE Nacionalidade IN (‘Portugal’,
‘Brasil’); (todos os clientes portugueses ou brasileiros)
SELECT * FROM Cliente WHERE Nacionalidade NOT IN (‘Portugal’,
‘Brasil’); (todos os clientes excepto os portugueses e brasileiros)
SELECT * FROM Cliente WHERE Nacionalidade IS NOT NULL; (todos os
clientes com nacionalidade conhecida)
Comando UPDATE
Um comando UPDATE para alteração de linhas obedece à seguinte
estrutura:
UPDATE tabela a alterar
SET coluna a alterar = expressão
WHERE expressão lógica que indica quais as linhas que
pretendemos alterar
O seguinte comando transforma os códigos postais 1200 em 1500:
UPDATE Cliente SET CodPostal = 1500
WHERE CodPostal = 1200;
Comando DELETE
Um comando DELETE para anulação de linhas obedece à seguinte
estrutura:
DELETE FROM tabela a anular
WHERE expressão lógica que indica quais as linhas que
pretendemos alterar
O seguinte comando apaga os códigos postais 1200
DELETE FROM Cliente
WHERE CodPostal = 1200;
Comando INSERT
Através do comando INSERT podem-se inserir uma linha ou várias
linhas em simultâneo. Para inserir uma linha um comando INSERT
obedece à seguinte estrutura:
INSERT INTO tabela a inserir (colunas onde vão ser inseridos os valores)
VALUES (valores a inserir)
Para inserir um conjunto de linhas, um comando INSERT obedece à
seguinte estrutura:
INSERT INTO tabela a inserir (colunas onde vão ser inseridos os valores)
SELECT valores a inserir
FROM ...
INSERT INTO Produto (cod_produto, tipo) VALUES (123456, ‘MP’);
INSERT INTO Produto (cod_produto, tipo)
SELECT cod_materia, ‘MP’ FROM Materia_Prima;
Optimizações de Querys (I)
Na maioria dos SGBD’s a optimização de querys é feita
automaticamente pelo planeador do SGBD. Ele, com base em
estimativas de tempos e com base no histórico das transacções,
decide qual a melhor estratégia a adoptar para executar uma query.
Exemplos
select PLAN('SELECT Titulo FROM Pub'); Índice apenas em ISBN e Data
Scan pub sequentially
select PLAN('SELECT ISBN FROM Pub');
Scan pub sequentially
select PLAN('SELECT ISBN FROM Pub Order By ISBN');
Scan pub using index ndx_id Não vale a pena
select PLAN('SELECT * FROM Pub Where Data = 1900 ‘);
usar o índice
Scan pub using index ndx_data
select PLAN('SELECT * FROM Pub Where Data = 1900 or Data = 2000’);
Scan pub sequentially
Views
As Views não são mais do que comandos SELECT armazenados.
São por vezes denominadas tabelas temporárias. Note-se que o
resultado de uma execução de uma view (os registos que ela
devolve) depende dos registos armazenados no momento nas tabelas
de suporte à view. As views podem ser utilizadas dentro de
comandos SELECT.
CREATE VIEW Clientes_Lisboa (BI, Nome)
AS Select BI, Nome FROM Cliente KEY JOIN Localidade
Where Localidade = 'Lisboa'
WITH CHECK OPTION;
Select Nome From Clientes_Lisboa;
As views não podem conter a cláusula ORDER BY e apenas permitem a
inserção, remoção e alteração de registos caso não contenham as cláusulas
GROUP BY e UNION. A cláusula CHECK OPTION rejeita alterações e
inserções na view que não obedeçam ao critério da cláusula SELECT que a
define.