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