BASES DE DADOS I
LTSI/2
Universidade da Beira Interior, Departamento de Informática
Hugo Pedro Proença, 2010/2011
A Linguagem SQL
As raízes da linguagem SQL remontam a 1974, altura
em que a IBM desenvolvia um protótipo de um sistema
relacional, designado “System R”.
Simultaneamente foi desenvolvida uma linguagem,
designada SEQUEL, destinada a ser utilizada nesse
sistema e que mais tarde veio a dar origem à
linguagem SQL – Structured Query Language.
Em 1984 foi proposta a sua estandarização, tendo o
ANSI e a ISO criado grupos de trabalho para o efeito.
A Linguagem SQL
A primeira versão-standard foi proposta em 1986, com a designação SQL-86.
Surgiram regularmente novas revisões SQL-89, SQL-93 e está em preparação
o lançamento de uma nova, que incorporará características tipicamente
associadas à programação orientada por objectos.
É uma linguagem de alto nível e disponibiliza formas de interacção com
multiplos sistemas gestores de bases de dados.
A linguagem pode ser decomposta em três grupos principais:
DMLData Manipulation Language
DDL Data Definition Language
DAL Data Administration Language
A Linguagem SQL
DMLData Manipulation Language
Conjunto
de instruções que possibilitam a manipulação
da informação existente numa base de dados.
Inserir
informação
Alterar informação
Eliminar informação.
Consultar informação
A Linguagem SQL
DDLData Definition Language
Conjunto
de instruções que possibilitam a definição da
estrutura de uma base de dados.
Criar
relações
Alterar relações
Eliminar relações
A Linguagem SQL
DALData Administration Language
Conjunto
de instruções que possibilitam a definição da
politica de previlégios sobre a informação existente
numa base de dados.
Gerir
utilizadores
Gerir permissões sobre objectos da base de dados
Relações
Vistas
Funções e Procedimentos
SQL-DDL
Como já foi referido anteriormente, o SQL possui simultaneamente
instruções de definição de dados (Data Definition Language - DDL). Estas
servem para definir (criar e/ou alterar) a estrutura da base de dados e
fazer a passagem do modelo conceptual entretanto finalizado para o
modelo físico.
Alteração da estrutura da base de dados
Criação, Alteração ou Eliminação de relações (CREATE TABLE, ALTER
TABLE e DROP TABLE)
SQL-DDL
Tipos de Dados:
A especificação do domínio de cada atributo (conjunto de valores passíveis
de atribuir a cada atributo de cada tuplo de uma relação), pode variar
consoante o SGBD onde é implementada a Base de Dados.
Diferentes SGBD´s incorporam pequenas variantes nos tipos de dados
passíveis de definição e nos tipos de dados disponíveis.
A SQL-92 possui alguns tipos estandardizados, designados tipos primitivos:
INTEGER, SMALLINT, DECIMAL, DOUBLE PRECISION, FLOAT: para valores
numéricos
CHAR, VARCHAR: para valores alfanuméricos
DATE, TIME, TIMESTAMP: para valores de Data e Tempo
BIT: para valores booleanos.
SQL-DDL
Tipos de Dados:
Adicionalmente é também possível definir novos tipos de dados, apesar
destes terem que se basear em tipos de dados primitivos.
Este mecanismo é essencialmente um mecanismo de definição de
“ALIAS”.
CREATE DOMAIN morada VARCHAR(30)
Especifica a criação de um novo tipo de dados, designado “morada”,
e que é formado por um conjunto de caracteres que pode ter no
máximo comprimento igual a 30.
SQL-DDL - Criação
Criação de Tabelas
CREATE TABLE <nome_tabela>(
<Coluna1> <Tipo1>
[<Opcoes1>],
<Coluna2> <Tipo2> [<Opcoes2>],
...
<Colunan> <Tipon> [<Opcoesn>],
[restrições de integridade]);
<Colunai> Nome da i-nesima coluna
<Tipoi>Tipos de dados da i-nesima coluna
<Opcoesi> Opções relativas à i-nésima coluna
Restrições de integridadeEventuais restrições a acrescentar à definição
da tabela (chaves, restrições de referência e restrições de intervalo)
SQL-DDL - Criação
Criação de Tabelas
CREATE TABLE Aluno(
Numero INTEGER PRIMARY KEY,
Nome VARCHAR(80) NOT NULL,
MORADA VARCHAR(80)
);
Específica a criação de uma nova relação com 3 atributos.
“Numero” é do tipo inteiro e constitui a chave primária da
relação. Nome e Morada são do tipo alfanumérico, sendo
que “Nome” não pode conter valores nulos.
SQL-DDL - Criação
Criação de Tabelas
CREATE TABLE Nota(
CodAluno INTEGER,
CodDisciplina INTEGER,
Ano INTEGER,
Nota FLOAT,
CONSTRAINT C1 PRIMARY KEY (CodAluno,
CodDisciplina, Ano),
CONSTRAINT C2 CHECK Nota > 0,
CONSTRAINT C3 CHECK Ano IN (1,2,3,4,5)
);
Específica a criação de uma nova relação com 4 atributos. A chave
primária é uma chave composta e existem duas relações de intervalo para
dois dos atributos (“Ano” e “Nota”)
SQL-DDL - Criação
Criação de Tabelas
CREATE TABLE Utilizacao_Peca(
CodUtilizacao INTEGER PRIMARY KEY,
CodPeca INTEGER,
Quantidade INTEGER,
CONSTRAINT C1 FOREIGN KEY (codPeca) REFERENCES Peca (CodPeca),
CONSTRAINT C2 CHECK Quantidade > 0
);
Específica a criação de uma nova relação com 3 atributos. A chave
primário será o código da utilização de peça e existe uma restrição de
referência. Todos os valores que forem registados no atributo “CodPeca”
devem ter correspondência no atributo “CodPeca” da relação “Peca”.
Existe ainda uma restrição de intervalo.
SQL-DDL - Criação
Criação de Tabelas
CREATE TABLE Utilizacao_Peca(
CodUtilizacao INTEGER PRIMMARY KEY,
CodPeca INTEGER,
CONSTRAINT FOREIGN KEY (codPeca) REFERENCES Peca
(CodPeca)
ON UPDATE CASCADE
ON DELETE SET NULL,
);
Específica a criação de uma nova relação com 2 atributos. As duas ultimas
linhas servem para especificar que ao actualizar ou eliminar informação
da relação para onde a restrição se refere (Peca) se devem
respectivamente eliminar os respectivos tuplos ou colocá-los com valor nulo.
SQL-DDL - Criação
ON DELETE | INSERT | UPDATE <ACCAO>
Estas clausulas servem para garantir a consistência da informação na
base de dados após a alteração de informação. Imagine-se o seguinte
esquema de relacionamento:
Duas relações (“Obra” e “Responsável”) para registar as obras em curso por parte de uma
empresa de construção, podendo cada obra possuir entre 0 e “n” responsáveis.
Obra
Descrição
Local
Obra
Responsável
123
Prédio
Lisboa
123
José
671
Estrada
Covilhã
123
Rita
129
Saneamento
Fundão
671
Paulo
SQL-DDL - Criação
ON DELETE | INSERT | UPDATE <ACCAO>
O que aconteceria à informação da relação que regista os
responsáveis de cada obra, caso fossem eliminada tuplos da relação
que regista as obras em andamento ?
X
Informação inconsistente ?
Obra
Descrição
Local
123
Prédio
Lisboa
671
Estrada
Covilhã
129
Saneamento
Fundão
?
Obra
Responsável
123
José
123
Rita
671
Paulo
SQL-DDL - Criação
ON DELETE | INSERT | UPDATE <ACCAO>
Para resolver estas situações especifica-se na criação da tabela que contém
restrições de referência (isto é, chaves externas), o que se pretende fazer
em caso de alteração da informação na relação referida.
CREATE TABLE Encarregado(
CodObra INTEGER,
Encarregado VARCHAR(30),
CONSTRAINT C1 PRIMARY KEY (CodObra, Encarregado)
CONSTRAINT C2 FOREIGN KEY (CodObra) REFERENCES Obra(CodObra)
ON UPDATE CASCADE
ON DELETE CASCADE);
SQL-DDL - Criação
ON DELETE | INSERT | UPDATE <ACCAO>
Com base na definição anterior, ao alterar informação na relação
“Obra” (eliminar tuplos, ou alterar o código de obra, por exemplo) vaise efectuar a mesma operação na relação “Responsável”. A este
processo designa-se operação em cascata.
Após a eliminação de um tuplo da relação “Obra”, todos os tuplos da
relação “Responsável” que contivessem valor para o atributo chave externa
igual ao eliminado, vão também ser eliminados.
Caso apenas seja alterada a relação “Obra”, então o código
correspondente à chave externa vai também ser actualizado em todos os
tuplos necessários.
O analista poderia considerar, por outro lado, que seria mais útil colocar os
respectivos valores para o campo chave-externa a NULL, em vez de eliminar
ou alterar informação.
SQL-DDL - Restrições
Definição de Restrições
Os exemplos atrás ilustrados mostram formas usuais de incluir restrições na
definição de relações.
Existe uma clausula geral para esse fim: “CONSTRAINT”
Serve para definir todos os tipos de restrições e atribuir a cada uma
delas um identificador
CONSTRAINT <NOME> <ESPECIFICAÇÃO>
<NOME> Nome da restrição.
<ESPECIFICAÇÃO> Especificação da restrição. É aqui que se define
o seu tipo e conteúdo.
SQL-DDL - Restrições
Restrições – Exemplo
CREATE TABLE Inscricao_Turma(
CodAluno INTEGER NOT NULL,
CodDisciplina INTEGER NOT NULL,
CodTurma INTEGER NOT NULL,
Ano INTEGER,
Data DATE DEFAULT NOW(),
CONSTRAINT chave_primaria PRIMARY KEY (CodALuno, CodDisciplina),
CONSTRAINT chave_ext_disciplina
FOREIGN KEY (CodDisciplina) REFERENCES Disciplina(CodDisciplina)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT chave_ext_akunos
FOREIGN KEY (CodAluno) REFERENCES Aluno(CodAluno)
ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT valor_ano CHECK Ano > 0);
SQL-DDL
Outras clausulas aplicáveis à criação de relações:
NOT NULL Indica que o atributo não poderá conter o valor nulo.
UNIQUE Indica que o valor a colocar no atributo terá que ser diferente
para todos os tuplos presentes na relação.
BETWEEN lim_inferior AND lim_superior Indica que o valor a assumir por
cada tuplo para determinado atributo terá obrigatoriamente que estar
entre “lim_inf” e lim_sup”.
IN (valor1, valor2, ..., valorn) Indica que o valor atribuído ao atributo em
cada tuplo existente na relação terá que assumir um dos “n” valores
descritos na lista.
SQL-DDL - Eliminação
Eliminação de Tabelas
DROP TABLE <nome_tabela>;
<nome_tabela> Nome da tabela a eliminar da base de dados.
Para eliminar relações de uma base de dados basta utilizar a instrução
DROP TABLE seguida do nome da tabela.
DROP TABLE Aluno;
SQL-DDL - Alteração
Alteração de Tabelas
A alteração de tabelas de uma base de dados pode ser feita
exclusivamente de duas formas:
Adição de colunas (atributos)
Eliminação de colunas (atributos).
ALTER TABLE <nome_tabela>
{[ADD COLUMN <nome_coluna> <tipo> [<Restrições>]]||
[DROP COLUMN <nome_coluna>]}
<nome_coluna> Nome da coluna a adicionar ou remover.
<tipo> Tipo do atributo que se deseja adicionar à relação.
<Restrições> Eventuais restrições a aplicar à coluna a adicionar. (Sintaxe
identica à da instrução CREATE TABLE).
SQL-DDL - Alteração
Alteração de Tabelas
Exemplos:
ALTER TABLE Aluno
DROP COLUMN Nome;
ALTER TABLE Aluno
ADD COLUMN Idade INTEGER
CHECK IDADE > 0;
SQL-DDL - Exercício
Criação de Bases de Dados
Criação de uma base de dados correspondente ao esquema:
Aluno (NumAluno, BI, Nome, Morada, CodPostal)
Disciplina (CodDisciplina, Nome, Programa, AnoLectivo)
Nota (NumAluno, Nota, CodInscricao, Época)
Inscricao (CodInscricao,NumAluno, Ano, CodDisciplina)
CodPostal (Codigo, Cidade)
SQL-DDL - Exercício
Criação de Bases de Dados
CREATE TABLE CodPostal(
Codigo INTEGER,
Cidade VARCHAR(100),
CONSTRAINT C1 Codigo PRIMARY KEY,
CONSTRAINT C2 Cidade NOT NULL);
CREATE TABLE Aluno(
BI INTEGER,
Nome VARCHAR(100),
Morada VARCHAR(100),
CodPostal INTEGER,
CONSTRAINT C1 BI PRIMARY KEY,
CONSTRAINT C2 Nome NOT NULL,
CONSTRAINT C3 CodPostal FOREIGN KEY
REFERENCES CodPostal(Codigo));