Informáca para as Ciências e Engenharias Versão : C

Preview:

Citation preview

Informá(caparaasCiênciaseEngenhariasVersão:C

(EngenhariaCivil)Aula8

PedroBarahona2016/17

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

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

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

BasesdeDados

l  BasedeDados:Conjuntodedadosestruturado.§  Semelhanteavetoresdeestruturasvistosnaaulapassada.

l  Bastantecomumparaguardardados.§  Permite usar os dados em diferentes programas (até usando

diferenteslinguagens).

l  Inclui:§  Suporteaoarmazenamentopermanente(emficheiros).§  Operações para criar, inserir, consultar/procurar, alterar, apagar,

etc.

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

SistemasdeGestãodeBasesdeDados

l  SistemadeGestãodeBasesdeDados(SGBD)

§  (Databasemanagementsystem,DBMS)

§  Combinaçãodeso_wareedados:

•  Basededados§  Ficheirosestruturados,comosdados.

•  Motordebasededados§  So_wareparaconsultaemodificaçãodosdados.

•  Esquemadebasededados:§  Especificaçãodaorganizaçãológicadosdados.

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

Ficheiros de suporte da base

de dadosUtilizador/Programador

Esquema da base de dados

Motor da

base dedados

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

SistemasdeGestãodeBasesdeDados

SGBDs-ModeloRelacional

l  Registo(objecto,en(dade)§  Conjuntodeatributos(campos)relacionados§  AnálogoàsestruturasemMatlab.

l  Campo(ouatributo)

§  Umdoscamposdeumregistodabasededados.

l  Tabela

§  Conjuntoderegistos.§  AnálogoaovectordeestruturasemMatlab.

l  Basededadosrelacional§  Conjuntodetabelasrelacionadas

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

l  TabeladeFilmesdeumabasededadosDBvideos

Exemplo–TabeladeFilmes

Como identificar um registo?

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

TabelaseChaves

l  AtabelaFilmestemquatrocampos

§  FiIme_id

§  Titulo

§  Tipo

§  Classificacao

l  Chaveprimária(primarykey)

§  Um campo ou combinação de campos que iden(ficainequivocamenteesseregisto

§  AchaveprimáriaéFilme_id.

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

l  TabeladeClientesdeumabasededadosDBvideos

Exemplo–TabeladeClientes

Chave primária: Cliente_id

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

l  Comoserelacionamosclientescomosfilmesquealugam?

§  AtravésdeumatabeladeAlugueres!

l  AtabelaAluguerestemduaschavesexternas:

§  FiIme_id,quealigaàtabelafilmes

§  Cliente_id,quealigaàtabelaclientes

§  Aluguer_idéasuachaveprimária

Exemplo–TabeladeAlugueres

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

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

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

SQL

l  Uma linguagem para manipular dados e efetuar perguntas(queries)sobreosdadosarmazenadosnabasededados.§  InterpretadapelomotordoSBD§  Independentedaslinguagensdeprogramação§  Usávelintera(vamentepelou(lizador

l  Permite:§  Criartabelas,descrevendoosseuscampos(esquema).§  Inserir,alterareremoverregistosdastabelas.§  Fazerperguntas(interrogações).

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

CriaçãodeTabelasemSQL

l  TabelassãocriadascomainstruçãoCREATE

emqueparaalémdonomeda tabela são iden(ficadosos seuscamposcomosrespec(vos(pos.

l  Tipicamente os (pos u(lizados são numéricos, textuais ouBooleanos(BOOL).

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

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

l  Exemplo: Tabela de elementos químicos com as respec(vasmassasatómicas.

§  Tiposnuméricosmaisu(lizados:•  INTEGER:Inteiro;•  Real:Real•  DOUBLE:Realcomprecisãodupla

§  Tiposdestring:•  CHAR(N):stringcomexactamenteNcaracteres.•  VARCHAR(N):stringcomNcaracteresnomáximo•  TEXT:stringmaislonga

•  Nota:emSqlite3:étudotratadocomoTEXT

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

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

CriaçãodeTabelasemSQL

l  Em SQL é indiferente escrever as palavras-chave emmaiúsculasouminúsculas.§  Noentanto,écomumescrever-seemmaiúsculas.

l  Quantoaosnomesdoscamposetabelasdependedosistema.§  À cautela, é melhor escrever estes nomes de forma

consistente.

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

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

CriaçãodeTabelasemSQL

l  NacriaçãodeTabelasdeveserespecificadaumachaveprimária

l  A chave primária corresponde ao campo (ou combinação decampos)queiden(ficaminequivocamentecadaregisto.

§  Repe(ções (registos com a mesma chave primária) não são

permi(das(éreportadoumerro).

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

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

CriaçãodeTabelasemSQL

l  Exemplo:TabeladeFilmes

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çãodeTabelasemSQL

l  Exemplo:TabeladeClientes

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çãodeTabelasemSQL

l  Exemplo:TabeladeAlugueres

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

CriaçãodeTabelasemSQL

EliminaçãodeTabelasemSQL

l  EliminarTabela:DROP§  Apósacriaçãodeumatabelaqueporalgummo(vonãonos

interessa,porexemplo,

elapodesereliminada(comtodososregistosnale incluidos)atravésdocomandoDROP

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

db >> DROP TABLE Errada;

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

InserçãodeRegistosemSQL

l  Inserirregistos:INSERT§  Um registo pode ser inserido numa tabela com a instrução

INSERT

§  Osvaloresdoscamposnesteregisto,sãoindicadosnamesmaordemdadefiniçãooriginaldoscamposnoCREATETABLE.

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

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

INSERT INTO tabela VALUES ( valor1, valor2, ..., valorN)

SelecçãodeRegistosemSQL

l  Selecionarregistos:SELECT§  Umoumais registos podem ser selecionadosdumaoumais

tabelastabelacomainstruçãoSELECT

§  OsregistossãofiltradospelacondiçãoWHERE§  Podemserapresentadosdeumaformaordenadapelaopção

ORDERBY.

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

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

l  Algunsexemplos(umasó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

SelecçãodeRegistosemSQL

ModificaçãodeRegistosemSQL

l  AinstruçãoUPDATEpermitealterarvaloresdoscamposdeumatabela,paraosregistosselecionados

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çãodeRegistosemSQL

l  A instrução DELETE permite apagar todos os registos de umatabela,selecionadosporumacondição(opcional).

l  Nota: Apagar os registos todos de uma tabela não elimina atabela.§  ParaofazerdeveserusadoocomandoDROP

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

Nestecursovamosu(lizaroSQLITE

l  Motordebasesdedados

l  Gratuito,códigoaberto§  hrp://www.sqlite.org/

l  Podemosusá-lointerac(vamentecomointerpretadordelinhadecomando.

l  InterpretaSQLegereabasededados

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

l  Paraexecutar:descarregaroexecutáveldoSQLitedehMps://sqlite.org/download.html

§  NoWindows:descarregarumdosficheirossqlite-dll-win64-x32-3180000.zipsqlite-dll-win64-x64-3180000.zip

Descomprimirecolocaroficheirosqlite3.exenapastadetrabalho

§  NoMac:descarregaroficheirosqlite-tools-osx-x86-3180000.zip

Descomprimirecolocaroficheirosqlite3napastadetrabalho

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

SQLite

l  Para criar/u(lizar em SQLITE uma base de dados, com nomebaseDados, existente na directoria corrente, (tal como oprogramasqlite3)podeu(lizar-seaconsoladosistema(e.g.CmdnoWindowsouTerminalnoMac)eu(lizarocomando

sqlite3 baseDados

l  A par(r da janela de comandos doOCTAVE deverá proceder-sesemelhantemente, mas especificando que se trata de umachamadadosistemaopera(vo(sqlite3nãoéumficheiro.m)

l  No final, volta-se à janela de comandos do OCTAVE com acomandosqlite“.quit”.

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

>> system(‘sqlite3 exemplo.db’)

SQLite

Exemplo:

l  Criação de uma base de dados, com uma tabela de elementosquímicos,introduzindo-seoselementosHeHe.

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 algunscomandospar(culares(iniciadoscom“.”)§  .help

•  listacomandosdisponíveis(alémdoSQL)§  .readnomeFicheiro

•  executascriptSQL§  .schema

•  listaesquemasdastabelas§  .quit

•  sairdointerpretador

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

SQLite

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

linhasdecon(nuaçãoparacont§  .tables

•  listaastabelas§  .separatorsep

•  especificasepcomoseparadordoscampos§  .importficheirotabela

•  Importa o ficheiro para a tabela assumindo os camposseparadospeloseparadordefinido

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

SQLite

l  Exemplo:Comabasededados,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 >>

SQLite

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

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

MATLAB+SQLite

l  ParacombinarSQLcomMATLAB,usamosumafunçãoquecorreoSQLiteparaexecutarocomandoSQLquequeremos.

l  Como vimos, o SQLite pode ser executado com parâmetros nalinhadecomando(consoladosistema)§  nomedoficheirocomabasededados.§  eumcomandoSQL

l  Amesmaoperaçãopodeserfeitaapar(rdajaneladecomandosdoOCTAVE,atravésdeumachamadaaosistema.

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

Exemplo:

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

l  Ou através da chamada de sistema a par(r da janela de

comandosOCTAVE

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  Emgeral,aexecuçãodecomandosSQLapar(rdeumprogramaMATLABpodeserfeitacomafunçãosqlite,comassinatura

§  Basicamente,estafunçãochamaafunçãosystemdoOCTAVE,

com o comando fornecido na string sql passada comoargumento

•  Garan(ndoqueasplicassãosubs(tuidasporaspas,parasercompayvelcomalinguagemSQL.

§  Nota: esta função tem elementos que não fazem parte damatériadeICE.

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

MATLAB+SQLite

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

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

l  Sendo disponibilizado um conjunto de dados sobre praias, e anecessidade de obras de consolidação, pretende-se usar umsistema de gestão de bases de dados (SGBD) para gerir ainformaçã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  Oficheirotexto,comnomepraias.txt,comainformaçãosobreaspraiastemváriaslinhas,cadaumareferenteaumaobra,comoscampos,separadospor“;”

<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;MediaSan(agodoCacem;ArribadaPraiaFontedoCor(co;23000.00;MediaSines;RelocalizacaodeacessosdaspraiasdeMorgavel,FranquiaeFarol;100100.00;MediaSetubal;ArribasdapraiadeGalapos;100000.00;BaixaViladoBispo;Alimentacaoar(ficialdapraiadaMareta;2500000.00;ElevadaPor(mao;SaneamentodaarribanapraiadoVau;30000.00;Elevada

Exemplo:MATLAB+SQLite

Exemplo:MATLAB+SQLite

l  Maisespecificamente,pretende-se

a)  Criarumabasededados(BD)comumatabela

b)  Inserirdadosdosprojectosderecuperação

c)  Ques(onaraBDusandoSQL

l  Exemplo:§  obterosprojectosdeprioridadealta,médiaebaixa.

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

l  Acriaçãodatabela,quechamaremosProjetos,éfeitaatravésdeum só comando SQL, chamado do OCTAVE pela função sqlitedefinidaatrás.

l  De notar a especificação da PRIMARY KEY, que garante umaiden(ficação única de cada registo e a não existência derepe(ções.§  Nestecaso,asobrastêmumnomeú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êPRIMARYKEY?§  Numa base de dados relacional, as chaves permitem

relacionartabelasdiferentes.§  E mesmo só com uma tabela devemos poder iden(ficar

inequivocamentecadaregisto•  porexemplo,paraevitarainserçãodeduplicados•  Nestecasoassumimosquedoisprojectoscomomesmo

nomeseriaumerro

l  OSQLitecriasempreumatributochamadoRowidque iden(ficainequivocamentecadaregisto,mesmoquenãosecrieumachaveprimária.§  No entanto, esse não serve para evitar registos repe(dos

porqueincrementaautoma(camente.

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

Exemplo:MATLAB+SQLite

l  Testes§  Podemos começar por criar a tabela de Projectos numa BD,

quechamaremosdepraias.db,parapodermostestarafunçãoquecarregaosdados.

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  Osdadospodemsercarregadosnatabelaatravésdeumafunçãocomassinatura

function carrega_praias(nomeFich, nomeBD)

que

a)  Abreoficheirodedadosemmododeleitura

b)  Paracadalinha1.  Lêosvárioscampostendoemcontaoseuseparador

•  Convertendoocustonumvalornumérico2.  CriaumastringcorrespondenteaocomandoSQLINSERT,comos

dadosdecadalinhalidos3.  Executaocomandocomachamadaàfunçãosqlite

c)  Fechaoficheirodedados

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

verificarseelesestãocorretamenteinserido

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 dadosemqueascondiçõesWHEREnãoexigemigualdadesestritasmasapenas “semelhanças”, em que alguns caracteres nos campos apesquisarpodemnãoseriguais.

l  Paraesseefeito§  Usa-seapalavraLIKE,emvezdosimbolodeigualdade§  U(lizam-se wildcards, %, para susbs(tuirem quaisquer

caracteres.

l  Como anteriormente, estas consultas podem ser feitasdirectamentedoOCTAVE

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

Exemplo:MATLAB+SQLite

l  Exemplo1(comLIKEewildcards)

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  Exemplo2(comLIKEewildcards)

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 repe(ções nasrespostas,nomeadamentese

§  váriosregistossa(sfaçamascondições;e§  apenassepretendamalgunsdocamposdosregistosiniciais

l  Paraevitarestas repe(çõespodeu(lizar-sea varianteda instruçãoSELECT,contendoavarianteDISTINCT

l  Comoanteriormente,estasconsultaspodemserfeitasdirectamentedoOCTAVE

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

Exemplo:MATLAB+SQLite

l  Exemplo3(comDISTINCT)

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, retornamuma string,eventualmente com várias linhas, em que os campos dos registosretornados são delimitados pelo separador corrente (por omissão, oseparadoré“|”).

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,correspondendoaosregistosretornados.

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

function recs = parseRecords (sqlResult,nameString)

Nota:estafunçãotemelementosquenãofazempartedamatériadeICE.

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

l  Query:

§  Obternomeecustodeprojetoscomumadadaprioridade.

Nota: A função sprinX funciona como fprinX mas em vez de escrever numficheiroouconsoladevolveastringformatada.

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:

§  Obterasobrasseparadasporprioridades«  Bastajuntarasqueries/funçõesanteriores

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

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 >> ...

l  Testar

Exemplo:MATLAB+SQLite

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

Exemplo:MATLAB+SQLite

l  Testar

ParaConsultar

l  SQL

§  MuitofácilencontrartutoriaisnaWeb,masnormalmentetêmmuitomaisdoquedamosaqui.

§  Exemplodeuma“cábula”quepodeserú(l:

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

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