10.11.2014 Views

Aula 7 - Departamento de Informática

Aula 7 - Departamento de Informática

Aula 7 - Departamento de Informática

SHOW MORE
SHOW LESS

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));

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!