63
Informá(ca para as Ciências e Engenharias Versão : C (Engenharia Civil) Aula 8 Pedro Barahona 2016 / 17

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

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

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

Informá(caparaasCiênciaseEngenhariasVersão:C

(EngenhariaCivil)Aula8

PedroBarahona2016/17

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

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

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

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

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

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

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

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

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

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

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

l  TabeladeFilmesdeumabasededadosDBvideos

Exemplo–TabeladeFilmes

Como identificar um registo?

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

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

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

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

l  TabeladeClientesdeumabasededadosDBvideos

Exemplo–TabeladeClientes

Chave primária: Cliente_id

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

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

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

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

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

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

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

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

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

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

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

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

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

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

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

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

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

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

Sumário

l  Introduçãoaossistemasdebasesdedados:

§  Modelorelacional

§  SQL(StructuredQueryLanguage)

§  SQLeMATLAB

§  Umexemploprá(co

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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