Upload
others
View
0
Download
0
Embed Size (px)
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