63
Informática para Ciências e Engenharias (B) 2016/17 Teórica 9

Informática para Ciências e Engenharias (B) 2016/17iceb.ssdi.di.fct.unl.pt/1617/teoricas/T09/iceb_t09.pdf · • SQL (Structured Query Language) • SQL e MATLAB • Um exemplo

Embed Size (px)

Citation preview

Informática para Ciências e Engenharias (B)

2016/17

Teórica9

Sumário

l  Introdução aos sistemas de bases de dados:

•  Modelo relacional

•  SQL (Structured Query Language)

•  SQL e MATLAB

•  Um exemplo prático

Nota: Alguns slides adaptados de N. Dell, J. Lewis, Computer Science Illuminated, 4th Ed

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Bases de Dados

l  Base de Dados: Conjunto de dados estruturado. •  Semelhante a vetores de estruturas vistos na aula passada.

l  Bastante comum para guardar dados. •  Permite usar os dados em diferentes programas (até usando

diferentes linguagens).

l  Inclui: •  Suporte ao armazenamento permanente (em ficheiros). •  Operações para criar, inserir, consultar/procurar, alterar,

apagar, etc.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Sistemas de Gestão de Bases de Dados

l  Sistema de Gestão de Bases de Dados (SGBD) •  (Database management system, DBMS) •  Combinação de software e dados:

•  Base de dados •  Ficheiros estruturados, com os dados.

•  Motor de base de dados •  Software para consulta e modificação dos dados.

•  Esquema de base de dados: •  Especificação da organização lógica dos dados.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Sistemas de Gestão de Bases de Dados

Ficheiros de suporte da base

de dadosUtilizador/Programador

Esquema da base de dados

Motor da

base dedados

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

SGBDs - Modelo Relacional

l  Registo (objecto, entidade) •  Conjunto de atributos (campos) relacionados •  Análogo às estruturas em Matlab.

l  Campo (ou atributo) •  Um dos campos de um registo da base de dados.

l  Tabela •  Conjunto de registos. •  Análogo ao vector de estruturas em Matlab.

l  Base de dados relacional •  Conjunto de tabelas relacionadas

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

l  Tabela de Filmes de uma base de dados DBvideos

Exemplo – Tabela de Filmes

Como identificar um registo?

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Tabelas e Chaves

l  A tabela Filmes tem quatro campos •  FiIme_id •  Titulo •  Tipo •  Classificacao

l  Chave primária (primary key) •  Um campo ou combinação de campos que identifica

inequivocamente esse registo •  A chave primária é Filme_id.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

l  Tabela de Clientes de uma base de dados DBvideos

Exemplo – Tabela de Clientes

Chave primária: Cliente_id

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

l  Como se relacionam os clientes com os filmes que alugam? •  Através de uma tabela de Alugueres!

l  A tabela Alugueres tem duas chaves externas: •  FiIme_id, que a liga à tabela filmes •  Cliente_id, que a liga à tabela clientes

•  Aluguer_id é a sua chave primária

Exemplo – Tabela de Alugueres

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

l  Introdução aos sistemas de bases de dados:

•  Modelo relacional

•  SQL (Structured Query Language)

•  SQL e MATLAB

•  Um exemplo prático

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Sumário

SQL

l  Uma linguagem para manipular dados e efetuar perguntas (queries) sobre os dados armazenados na base de dados. •  Interpretada pelo motor do SBD •  Independente das linguagens de programação •  Usável interativamente pelo utilizador

l  Permite: •  Criar tabelas, descrevendo os seus campos (esquema). •  Inserir, alterar e remover registos das tabelas. •  Fazer perguntas (interrogações).

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Criação de Tabelas em SQL

l  Tabelas são criadas com a instrução CREATE

em que para além do nome da tabela são identificados os seus campos com os respectivos tipos.

l  Tipicamente os tipos utilizados são numéricos, textuais ou Booleanos (BOOL).

CREATE TABLE nome-tabela ( Campo-1 tipo-1, Campo-2 tipo-2, ... Campo-n tipo-n );

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Criação de Tabelas em SQL

l  Exemplo: Tabela de elementos químicos com as respectivas massas atómicas.

l  Tipos numéricos mais utilizados: •  INTEGER: Inteiro; •  Real: Real •  DOUBLE: Real com precisão dupla

l  Tipos de string: •  CHAR(N): string com exactamente N caracteres. •  VARCHAR(N): string com N caracteres no máximo •  TEXT: string mais longa

•  Nota: em Sqlite3: é tudo tratado como TEXT

db >> CREATE TABLE Massas ( Simbolo TEXT, Massa DOUBLE); db >>

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Criação de Tabelas em SQL

l  Em SQL é indiferente escrever as palavras-chave em maiúsculas ou minúsculas. •  No entanto, é comum escrever-se em maiúsculas.

l  Quanto aos nomes dos campos e tabelas depende do sistema. •  À cautela, é melhor escrever estes nomes de forma

consistente.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

db >> CREATE TABLE Massas ( Simbolo TEXT, Massa DOUBLE); db >>

Criação de Tabelas em SQL

l  Na criação de Tabelas deve ser especificada uma chave primária

l  A chave primária corresponde ao campo (ou combinação de campos) que identificam inequivocamente cada registo.

•  Repetições (registos com a mesma chave primária) não

são permitidas (é reportado um erro).

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

db >> CREATE TABLE Massas ..>> ( Simbolo TEXT, Massa DOUBLE; ..>> PRIMARY KEY(Simbolo)); db >>

Criação de Tabelas em SQL

l  Exemplo: Tabela de Filmes

db >> CREATE TABLE Filmes ( Filme_id INTEGER, Titulo TEXT, ...>> Tipo TEXT, Classificacao TEXT, PRIMARY ...>> KEY(Filme_id) );

% Nota: A tabela é criada sem registos db >>

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Criação de Tabelas em SQL

l  Exemplo: Tabela de Clientes

db >> CREATE TABLE Clientes ( Cliente_id INTEGER, Nome ...>> TEXT, Morada TEXT, Numero_cartao_credito TEXT, ...>> PRIMARY KEY(Cliente_id) ); db >>

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Criação de Tabelas em SQL

l  Exemplo: Tabela de Alugueres

db >> CREATE TABLE Alugueres ( Aluguer_id INTEGER,...>> Cliente_id INTEGER, Filme_id INTEGER,...>> Data_aluguer TEXT, Data_entrega TEXT,...>> PRIMARY KEY(Aluger_id) );db >>

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Eliminação de Tabelas em SQL

l  Eliminar Tabela: DROP •  Após a criação de uma tabela que por algum motivo não

nos interessa, por exemplo,

ela pode ser eliminada (com todos os registos nale incluidos) através do comando DROP

db >> CREATE TABLE Errada (Num INTEGER, Nome TEXT);

db >> DROP TABLE Errada;

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Inserção de Registos em SQL

l  Inserir registos: INSERT •  Um registo pode ser inserido numa tabela com a

instrução INSERT

•  Os valores dos campos neste registo, são indicados na mesma ordem da definição original dos campos no CREATE TABLE.

db >> INSERT INTO Filmes VALUES (...>> 10,"Meaning of Life","comedia","maiores de 16"); db >>

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Selecção de Registos em SQL

l  Selecionar registos: SELECT •  Um ou mais registos podem ser selecionados duma ou

mais tabelas tabela com a instrução SELECT

•  Os registos são filtrados pela condição WHERE •  Podem ser apresentados de uma forma ordenada pela

opção ORDER BY.

SELECT lista-campos FROM lista-tabelas WHERE condição ORDER BY campo;

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Selecção de Registos em SQL

l  Alguns exemplos (uma só tabela):

db >> SELECT * FROM Filmes; % mostra todos os registos da tabela Filmes db >> SELECT Titulo FROM Filmes WHERE Tipo = "comedia"; % mostra os títulos dos registos da tabela Filmes % cujo tipo seja "comedia" db >> SELECT Titulo, Tipo FROM Filmes ORDER BY Titulo; % mostra os campos Titulo e Tipo dos registos da tabela % Filmes ordenados alfabeticamente pelo campo Titulo

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Modificação de Registos em SQL

l  A instrução UPDATE permite alterar valores dos campos de uma tabela, para os registos selecionados

db >> UPDATE Filmes SET Tipo = "drama" ...>> WHERE Titulo = "Elizabeth”;% altera todos os registos da tabela Filmes, cujo título seja "Elizabeth", alterando o valor do campo Tipo para drama.

UPDATE tabela SET campo = valor WHERE condição;

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Eliminação de Registos em SQL

l  A instrução DELETE permite apagar todos os registos de uma tabela, selecionados por uma condição (opcional).

l  Nota: Apagar os registos todos de uma tabela não elimina a tabela. •  Para o fazer deve ser usado o comando DROP

>> DELETE FROM Filmes WHERE Nome = "Avengers";% apaga todos os registos da tabela Filmes, cujo título seja ”Avengers”.

DELETE FROM tabela WHERE condição;

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

SQLite

Neste curso vamos utilizar o SQLITE

l  Motor de bases de dados

l  Gratuito, código aberto •  http://www.sqlite.org/

l  Podemos usá-lo interactivamente como interpretador de linha de comando.

l  Interpreta SQL e gere a base de dados

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

SQLite

l  Para executar: descarregar o executável do SQLite de https://sqlite.org/download.html

•  No Windows: descarregar um dos ficheiros sqlite-dll-win64-x32-3180000.zip sqlite-dll-win64-x64-3180000.zip

Descomprimir e colocar o ficheiro sqlite3.exe na pasta de trabalho

•  No Mac: descarregar o ficheiro sqlite-tools-osx-x86-3180000.zip

Descomprimir e colocar o ficheiro sqlite3 na pasta de trabalho

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

SQLite

l  Para criar/utilizar em SQLITE uma base de dados, com nome baseDados, existente na directoria corrente, (tal como o programa sqlite3) pode utilizar-se a consola do sistema (e.g. Cmd no Windows ou Terminal no Mac) e utilizar o comando

sqlite3 baseDados

l  A partir da janela de comandos do OCTAVE deverá proceder-se semelhantemente, mas especificando que se trata de uma chamada do sistema operativo (sqlite3 não é um ficheiro .m )

l  No final, volta-se à janela de comandos do OCTAVE com a comando sqlite .quit.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> system(‘sqlite3 exemplo.db’)

SQLite

Exemplo:

Criação de uma base de dados, com uma tabela de elementos químicos, introduzindo-se os elementos H e He.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> system(‘sqlite3 quimica.db’) sqlite> CREATE TABLE Elementos ..>> ( Numero INTEGER, Simbolo TEXT, ..>> PRIMARY KEY(Numero)); sqlite> INSERT INTO Elementos VALUES (1, ‘H’); sqlite> INSERT INTO Elementos VALUES (2, “He”); sqlite> SELECT * FROM Elementos 1|H 2|He sqlite> .quit >>

SQLite

l  Para além das instruções SQL, o SQLite dispõe de alguns comandos particulares (iniciados com “.”) •  .help

•  lista comandos disponíveis (além do SQL) •  .read nomeFicheiro

•  executa script SQL •  .schema

•  lista esquemas das tabelas •  .quit

•  sair do interpretador

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

SQLite

•  .prompt first cont •  Modifica o prompt normal do sqlite para first e o das

linhas de continuação para cont •  .tables

•  lista as tabelas •  .separator sep

•  especifica sep como separador dos campos •  .import ficheiro tabela

•  Importa o ficheiro para a tabela assumindo os campos separados pelo separador definido

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

SQLite

Exemplo: Com a base de dados, quimica.db, já criada

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

sqlite> .PROMPT ‘db >>’ ‘ -->> ’ db >> .schema CREATE TABLE elementos (Numero INTEGER, Simbolo TEXT,PRIMARY KEY (Numero)); db >> INSERT INTO Elementos -->> VALUES (3, “Li”); db >> SEPARATOR ‘ :: ‘ db >> SELECT * FROM Elementos 1 :: H 2 :: He 3 :: Li db >> .tables Elementos db >>

l  Introdução aos sistemas de bases de dados:

•  Modelo relacional

•  SQL (Structured Query Language)

•  SQL e MATLAB

•  Um exemplo prático

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Sumário

MATLAB + SQLite

l  Para combinar SQL com MATLAB, usamos uma função que corre o SQLite para executar o comando SQL que queremos.

l  Como vimos, o SQLite pode ser executado com parâmetros na linha de comando (consola do sistema) •  nome do ficheiro com a base de dados. •  e um comando SQL

l  A mesma operação pode ser feita a partir da janela de comandos do OCTAVE, através de uma chamada ao sistema.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

MATLAB + SQLite

Exemplo:

l  A inserção do elemento Berilio (Be) na base de dados “quimica.db” anteriormente criada, pode ser feita a partir da consola do sistema

l  Ou através da chamada de sistema a partir da janela de comandos OCTAVE

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

db >> INSERT INTO Elementos VALUES (4, “Be”); db >>

>> system(‘sqlite quimica.db “INSERT INTO Elementos ... VALUES (4, “Be”);’) >>

MATLAB + SQLite

l  Em geral, a execução de comandos SQL a partir de um programa MATLAB pode ser feita com a função sqlite, com assinatura

•  Basicamente, esta função chama a função system do

OCTAVE, com o comando fornecido na string sql passada como argumento •  Garantindo que as plicas são substituidas por aspas, para ser

compatível com a linguagem SQL.

•  Nota: esta função tem elementos que não fazem parte da matéria de ICE.

function result = sqlite(sql,db)

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

MATLAB + SQLite

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

function result = sqlite(sql,db) % result=sqlite(sql,db) % Executa o sqlite3 para processar o comando SQL % fornecido no primeiro argumento. Devolve o resultado % como string. Opcionalmente, pode receber o nome % do ficheiro da base de dados como segundo argumento. Se % omitido, assume ser temp.db.

if nargin < 2 % se o segundo argumento nao existe db = 'temp.db'; end

sql = strrep(sql,'"',''''); % troca plicas por aspas [stat,result] = system(['sqlite3 ',db,' "',sql,'"']); end

MATLAB + SQLite

l  Testar

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> sqlite(‘sqlite3 atoms.db’) ans = >> sqlite(‘CREATE TABLE Atomos (Num INTEGER, Simb TEXT);’, ‘atoms.db’) ans = >> sqlite(‘INSERT INTO Atomos VALUES (1,”H”);’,‘atoms.db’) ans = >> sqlite(‘INSERT INTO Atomos VALUES (2,”He”);’,‘atoms.db’) ans = >> sqlite('SELECT * FROM Atomos;',’atoms.db') ans = 1|H 2|He >>

l  Introdução aos sistemas de bases de dados:

•  Modelo relacional

•  SQL (Structured Query Language)

•  SQL e MATLAB

•  Um exemplo prático

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Sumário

Exemplo: MATLAB + SQLite

l  Sendo disponibilizado um conjunto de dados sobre praias, e a necessidade de obras de consolidação, pretende-se usar um sistema de gestão de bases de dados (SGBD) para gerir a informação.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Ficheiros de suporte da base

de dadosUtilizador/Programador

Esquema da base de dados

Motor da

base dedados

Exemplo: MATLAB + SQLite

l  O ficheiro texto, com nome praias.txt, com a informação sobre as praias tem várias linhas, cada uma referente a uma obra, com os campos, separados por “;”

<concelho> <obra> <custo> <prioridade>

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

MarinhaGrande;EsporaodaPraiadaVieira;720000.00;MediaLourinha;ArribasjuntoaofortedoPaimogo;591000.00;MediaLourinha;ArribasemPortodasBarcas;691000.00;MediaLourinha;ArribasemPortoDinheiro;606500.00;MediaSintra;ArribasdapraiaGrandedoRodizio;39951.63;MediaSintra;ArribasdapraiadasAzenhasdoMar;326560.08;MediaSintra;ArribasdapraiaPequena;428015.58;MediaSanUagodoCacem;ArribadaPraiaFontedoCorUco;23000.00;MediaSines;RelocalizacaodeacessosdaspraiasdeMorgavel,FranquiaeFarol;100100.00;MediaSetubal;ArribasdapraiadeGalapos;100000.00;BaixaViladoBispo;AlimentacaoarUficialdapraiadaMareta;2500000.00;ElevadaPorUmao;SaneamentodaarribanapraiadoVau;30000.00;Elevada

Exemplo: MATLAB + SQLite

l  Mais especificamente, pretende-se a)  Criar uma base de dados (BD) com uma tabela b)  Inserir dados dos projectos de recuperação c)  Questionar a BD usando SQL

•  Exemplo: obter os projectos de prioridade alta, média e baixa.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Exemplo: MATLAB + SQLite

l  A criação da tabela, que chamaremos Projetos, é feita através de um só comando SQL, chamado do OCTAVE pela função sqlite definida atrás.

l  De notar a especificação da PRIMARY KEY, que garante uma identificação única de cada registo e a não existência de repetições. l  Neste caso, as obras têm um nome único.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

function criaTabela(nomeBD) % Cria a tabela Projectos na base de dados indicada. sqlite([’CREATE TABLE Projectos ( Concelho text,',... 'Nome text, Custo float, Prioridade text,',... 'PRIMARY KEY(nome));'], nomeBD); end

Exemplo: MATLAB + SQLite

l  Porquê PRIMARY KEY? •  Numa base de dados relacional, as chaves permitem

relacionar tabelas diferentes. •  E mesmo só com uma tabela devemos poder identificar

inequivocamente cada registo •  por exemplo, para evitar a inserção de duplicados •  Neste caso assumimos que dois projectos com o mesmo

nome seria um erro •  O SQLite cria sempre um atributo chamado Rowid que

identifica inequivocamente cada registo, mesmo que não se crie uma chave primária.

•  No entanto, esse não serve para evitar registos repetidos porque incrementa automaticamente.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Exemplo: MATLAB + SQLite

l  Testes •  Podemos começar por criar a tabela de Projetos numa BD,

que chamaremos de praias.db, para podermos testar a função que carrega os dados.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> criatabela(’praias.db'); % verificar que tabelas existem na BD ‘praias.db>> sqlite('.tables',’praias.db') ans = Projectos >>

Exemplo: MATLAB + SQLite

l  Os dados podem ser carregados na tabela através de uma função com assinatura

function carrega_praias(nomeFich, nomeBD) que

a)  Abre o ficheiro de dados em modo de leitura b)  Para cada linha

1.  Lê os vários campos tendo em conta o seu separador l  Convertendo o custo num valor numérico

2.  Cria uma string correspondente ao comando SQL INSERT , com os dados de cada linha lidos

3.  Executa o comando com a chamada à função sqlite

c)  Fecha o ficheiro de dados

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Exemplo: MATLAB + SQLite

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

function carrega_praias(nomeFich, nomeBD) % documentação em anexo fid = fopen(nomeFich,'r'); while ~feof(id) linha = fgetl(fid); pVirgs = findstr(';', linha); concelho = linha(1:pVirgs(1)-1); nome = linha(pVirgs(1)+1:pVirgs(2)-1); custo = str2num(linha(pVirgs(2)+1:pVirgs(3)-1)); prioridade = linha(pVirgs(3)+1:end); sql = sprintf('insert into Projectos ... values("%s", "%s",%f,"%s");’,... concelho, nome, custo, prioridade) sqlite(sql, nomeBD); end fclose(fid); end

Exemplo: MATLAB + SQLite

l  Testes •  podemos agora inserir os dados do ficheiro praias.txt, e

verificar se eles estão corretamente inserido

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> carrega_praias(’praias.txt’, ‘praias.db'); % verificar que registos existem na tabela>> sqlite(’SELECT * FROM Projectos;','praias.db’) ans = Marinha Grande|Esporao da Praia da Vieira|720000.0|MediaLourinha|Arribas junto ao forte do Paimogo|591000.0|MediaLourinha|Arribas em Porto das Barcas|691000.0|MediaLourinha|Arribas em Porto Dinheiro|606500.0|MediaSintra|Arribas da praia Grande do Rodizio|39951.63|MediaSintra|Arribas da praia das Azenhas do Mar|326560.08|MediaSintra|Arribas da praia Pequena|428015.58|Media... Portimao|Saneamento da arriba na praia do Vau|30000.00|Elevada >>

Exemplo: MATLAB + SQLite

l  Em SQL podem ser feitas consultas (queries) às bases de dados em que as condições WHERE não exigem igualdades estritas mas apenas “semelhanças”, em que alguns caracteres nos campos a pesquisar podem não ser iguais.

l  Para esse efeito l  Usa-se a palavra LIKE, em vez do simbolo de igualdade l  Utilizam-se wildcards, %, para susbstituirem quaisquer

caracteres.

l  Como anteriormente, estas consultas podem ser feitas directamente do OCTAVE

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Exemplo: MATLAB + SQLite

l  Exemplo 1 (com LIKE e wildcards)

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> sqlite('SELECT Nome FROM Projectos WHERE Nome LIKE "Arriba%";',’praias.db’)

% quais os registos cujo Nome comeca por Arriba ans = Arribas junto ao forte do Paimogo Arribas em Porto das Barcas Arribas em Porto Dinheiro Arribas da praia Grande do Rodizio Arribas da praia das Azenhas do Mar Arribas da praia Pequena Arriba da Praia Fonte do Cortico Arribas da praia de Galapos>>

Exemplo: MATLAB + SQLite

l  Exemplo 2 (com LIKE e wildcards)

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> sqlite('SELECT Nome FROM Projectos WHERE Nome LIKE "%praia%";',’praias.db')

% quais os registos cujo Nome contem a palavra praiaans = Esporao da Praia da Vieira Arribas da praia Grande do Rodizio Arribas da praia das Azenhas do Mar Arribas da praia Pequena Arriba da Praia Fonte do Cortico Relocalizacao de acessos das praias de Morgavel,...Farol Arribas da praia de Galapos Alimentacao artificial da praia da Mareta Saneamento da arriba na praia do Vau>>

Exemplo: MATLAB + SQLite

l  As consultas em SQL podem originar muitas repetições nas respostas, nomeadamente se

l  vários registos satisfaçam as condições; e

l  apenas se pretendam alguns do campos dos registos iniciais

l  Para evitar estas repetições pode utilizar-se a variante da instrução SELECT, contendo a variante DISTINCT

l  Como anteriormente, estas consultas podem ser feitas directamente do OCTAVE

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Exemplo: MATLAB + SQLite

l  Exemplo 3 (com DISTINCT)

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> sqlite(‘SELECT DISTINCT Concelho FROM Projectos;’, ’praias.db')% quais os concelhos mencionados nos registos sem repeticoes ! ans = Marinha Grande

Lourinha Sintra Santiago do Cacem Sines Setubal Vila do Bispo Portimao

>> sqlite(‘SELECT DISTINCT Prioridade FROM Projectos;’, ’praias.db')ans = Media

Baixa Elevada

>>

Exemplo: MATLAB + SQLite

l  As consultas SQL, feitas através da função sqlite, retornam uma string, eventualmente com várias linhas, em que os campos dos registos retornados são delimitados pelo separador corrente (por omissão, o separador é “|”).

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> sqlite(’SELECT * FROM Projectos;','praias.db’) ans = Marinha Grande|Esporao da Praia da Vieira|720000.0|MediaLourinha|Arribas junto ao forte do Paimogo|591000.0|MediaLourinha|Arribas em Porto das Barcas|691000.0|MediaLourinha|Arribas em Porto Dinheiro|606500.0|MediaSintra|Arribas da praia Grande do Rodizio|39951.63|MediaSintra|Arribas da praia das Azenhas do Mar|326560.08|MediaSintra|Arribas da praia Pequena|428015.58|Media... Portimao|Saneamento da arriba na praia do Vau|30000.00|Elevada >>

Exemplo: MATLAB + SQLite

l  Em geral, será conveniente estruturar melhor estas respostas, transformando as strings retornadas num vetor de estruturas, correspondendo aos registos retornados.

l  Para esse efeito pode usar-se a função com assinatura abaixo que é especificada de seguida

function recs = parseRecords (sqlResult,nameString)

Nota: esta função tem elementos que não fazem parte da matéria de ICE.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

Exemplo: MATLAB + SQLite

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

function recs = parseRecords(sqlResult,nameString) % recs=parserecords(sqlResult,nameString) % Devolve um vector de estruturas organizando os dados na string % devolvida pelo SQLite. Assume que os campos estao separados % por uma barra |. O segundo argumento, opcional, contem uma % string com os nomes dos campos das estruturas devolvidas, % tambem separados por |. recs = []; if nargin < 2 names = {}; else names = strsplit(nameString,'|'); end ca = strsplit(sqlResult,"\n"); for f = 1:length(ca)-1 ... % converte a string sqlResult num vetor de estruturas end end

Exemplo: MATLAB + SQLite

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

for f = 1:length(ca)-1 line = deblank(ca{f}); if length(line) == 0 break end rec = strsplit(ca{f},'|'); for g = 1:length(rec) if g > length(names) campo = ['campo_',num2str(g)]; else campo = names{g}; end % converte em numero, se possivel testNum = str2double(rec{g}); if isnan(testNum) valor = rec{g}; else valor = testNum; end recs(f).(campo) = valor; end end

Exemplo: MATLAB + SQLite

Query: Obter nome e custo de projetos com uma dada prioridade.

Nota: A função sprintf funciona como fprintf mas em vez de escrever num ficheiro ou consola devolve a string formatada.

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

function projs = sel_prioridade(tabela, baseDados, prioridade) % projs=selprioridade(tabela, baseDados, prioridade) % selecciona da tabela da base de dados indicada os campos do % nome e custo dos projectos com a prioridade especificada. query = sprintf('SELECT Nome, Custo FROM %s WHERE ... Prioridade="%s";', tabela, prioridade); result = sqlite(query, baseDados); % obter vetor de estruturas com campos nome e custo projs = parseRecords(result, 'nome|custo'); end

Exemplo: MATLAB + SQLite

l  Testar

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> elevada = sel_prioridade('Projectos', ’praias.db', 'Elevada');>> elevada(1) nome = Alimentacao artificial da praia da Mareta custo = 2500000 >> elevada(2) nome = Saneamento da arriba na praia do Vau custo = 30000 >> baixa = sel_prioridade('Projectos', ’praias.db', 'Baixa')baixa = nome = Arribas da praia de Galapos custo = 100000>>

Exemplo: MATLAB + SQLite

l  Query: Obter as obras separadas por prioridades

l  Basta juntar as queries/funções anteriores

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

function [elevada,media,baixa] = processa_projs(fich, baseDados) % [alta,media,baixa]=processaprojs(fich, baseDados) % Cria a tabela Projectos na base de dados indicada, % carrega os dados do ficheiro e selecciona da tabela % os campos do nome do projecto e custo, separando em % tres vectores de estruturas conforme a prioridade. criatabela(baseDados); carrega_praias('praias.txt', baseDados); elevada = selprioridade('Projectos', baseDados, 'Elevada') media = selprioridade('Projectos', baseDados, 'Media') baixa = selprioridade('Projectos', baseDados, 'Baixa') end

Exemplo: MATLAB + SQLite

l  Testar

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> [elev, medi,baix] = processaprojs('praias.txt',’outra.db') elev = 1x2 struct array containing the fields: nome custo medi = 1x9 struct array containing the fields: nome custo baix = scalar structure containing the fields: nome = Arribas da praia de Galapos % mostra o valor dos custo = 100000 % campos por so ter um elemento >> ...

Exemplo: MATLAB + SQLite

l  Testar

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB

>> elev.nomeans = Alimentacao artificial da praia da Maretaans = Saneamento da arriba na praia do Vau>> med.nomeans = Esporao da Praia da Vieiraans = Arribas junto ao forte do Paimogoans = Arribas em Porto das Barcasans = Arribas em Porto Dinheiroans = Arribas da praia Grande do Rodizioans = Arribas da praia das Azenhas do Marans = Arribas da praia Pequenaans = Arriba da Praia Fonte do Corticoans = Relocalizacao de acessos das praias de Morgavel, Franquia e Farol >>

Para Consultar

l  SQL •  Muito fácil encontrar tutoriais na Web, mas normalmente

têm muito mais do que damos aqui. •  Exemplo de uma “cábula” que pode ser útil:

http://www.zentut.com/sql-tutorial/sql-cheat-sheet/

10Maio2017 9:IntroduçãoàsBasesdeDados:SQLeMATLAB