Pagina 1 di 1
Brescianet.com
Sito di supporto alla didattica
http://lnx.brescianet.com/ScuolaForum2016/
4Q - 2 MODULO
http://lnx.brescianet.com/ScuolaForum2016/viewtopic.php?f=4&t=21
4Q - 2 MODULO
da e01692
Appunti estemporanei
24/1/2017 - 4Q - 2 MODULO
da e01692
linguaggio SQL => linguaggio di interrogazione dei db => usato nelle query
comandi sql => utilizzati nelle pagine web dinamiche per estrarre i dati richiesti dall'utente mediante un forms
INTERFACCIA QUERY
La riga "mostra" serve ad occultare le colonne che occupano una determinata posizione per rispettare un determinato ordinamento (esempio classe, nominativo) ma tale ordine risultA diverso da quello di visualizzazione (esempio prima il nominativo e poi la classe).
MOSTRA => Consente l'occultamento di un campo non necessario (esempio filtro o ordinamento incompatibile con l'ordine di visualizzazione delle colonne)
Criteri sulla stessa riga sono collegati dalla clausola AND (ED ANCHE) Criteri su righe # sono collegati dalla clausola OR (OPPURE)
riprendere dall'SQL
7/2/2017 - 4Q - 2 MODULO
da e01692
SQL => linguaggio di interrogazione strutturato per estrarre dati da un archivio non è case sensitive
select * from studenti => estraggo l'intero contenuto della tabella studenti SELECT => identifica una qry di selezione
FROM => parola chiave a cui segue il nome della tabella dove estrarre i dati
* indica qualsiasi campo SELECT [prov] from clienti equivale a:
SELECT prov from clienti
Se ho spazi nel nome del campo devo usare []
SELECT [Ragione Sociale] from clienti Questo comando sql darà errore:
SELECT Ragione Sociale from clienti
Inviato: 24/01/2017, 9:57
Inviato: 24/01/2017, 9:57
Inviato: 07/02/2017, 10:02
In openbase il delimitatore per il nome del campo è il codice ascii 96 (premere ALT e digitare assieme il numero 96 con il tastierino numerico)
SELECT `Ragione Sociale` FROM Clienti rinomina una colonna con la parola chiave AS SELECT prov as provincia from clienti
SELECT prov as [provincia di residenza] from clienti Se nell'interfaccia grafica in un campo metto
Matricola:NomeCampo => segue la rinomina della colonna da "NomeCampo" a Matricola per inserire + campi devo scriverli dopo la clausola SELECT separandoli con la ,
SELECT [ragione sociale], prov from clienti
SELECT [ragione sociale] as [Nome Ditta], prov as [provincia di residenza] from clienti
ORDER BY => clausola di ordinamento (corrisponde alla riga "Ordinamento" dell'interfaccia grafica delle Qry SELECT [ragione sociale], prov from clienti order by prov
Se devo ordinare per provincia e poi per ragione sociale basta elencare i campi coinvolti nell'ordinamento in sequenza separandoli con ,
SELECT [ragione sociale], prov from clienti order by prov, [ragione sociale]
scrivere
SELECT IdCliente, [Ragione Sociale], prov FROM Clienti ORDER BY prov, [Ragione Sociale]
è diverso da
SELECT IdCliente, [Ragione Sociale], prov FROM Clienti ORDER BY [Ragione Sociale], prov La priorità di ordinamento è dettata dall'ordine dei campi dopo la clausola order By
La direttiva DESC definisce un ordinamento decrescente (va inserito dopo il nome del campo associato).
La direttiva ASC definisce un ordinamento crescente (E' inutile essendo il comportamento predefinito).
In SQL nomi che non corrispondono al nome di un campo vengono trattati come se fossero variabili. Viene quindi richiesta una valorizzazione per tale nome sconosciuto e da quel momento in poi il valore digitato verrà usato all'interno della Qry.
La direttiva TOP n estra i primi n record risultanti dall'ordinamento indicato con ORDER BY. Se ci sono record a pari merito (con gli stessi valori nei campi indicati nell'order by) il nr di righe che appare all'orizzonte
potrebbe essere superiore!
27/1/2017 4T riprendere dai filtri operatori di relazione
< minore
>
<> diverso
=
>=
<=
A < B => le espressioni che utilizzano gli operatori di relazione restituiscono o vero o falso select * from studenti where eta>=18 => elenco degli studenti maggiorenni
WHERE Elenco di condizioni => restituisce le righe della tabella per cui l'insieme delle condizioni restituiscono
vero
Fatturato > 100 => solo i clienti con un fatturato > 100 verranno estratti poichè tale espressione con questi record restituisce TRUE
SELECT * FROM CLIENTI WHERE TRUE => mostro tutti i clienti - true è una costante che vale sempre vero per cui tutte le righe della tabella indicata in FROM verranno visualizzate.
condizione1 and condizione2 => vera solo quando condizione1 e condizione2 sono contemporaneamente vere, falsa altrimenti
condizione1 or condizione2 => falsa solo quando condizione1 e condizione2 sono contemporaneamente false, vera altrimenti
not condizione => vera se condizione è falsa e viceversa 4O 30/1/2017
riprendere da esempio 7 1+3*2
diverso (1+3)*2 1+3*2 equivale 1+(3*2)
SELECT * FROM CLIENTI WHERE (PROV=BS)
mi richiede di valorizzare BS poichè viene interpretato come se fosse un campo. Non esistendo BS nella struttura dati della taBELLA clienti ACCESS ne richiede la valorizzazione
SELECT * FROM CLIENTI WHERE (PROV="BS") funziona senza problemi. E' equivalente a:
SELECT * FROM CLIENTI WHERE (PROV='BS')
"BS" è una stringa (una costante caratterizzata da una sequenza di char ASCII
NOT A OR B AND C equivale a:
(NOT A) OR (B AND C)
poichè l'operatore unario ha precedenza su tutti gli altri operatori booleani (deve essere risolto per primo!) AND ha precedenza sull'or
V => vero =1 F => falso =0
TAVOLE DELLA VERITA' DEGLI OPERATORI LOGICI Not v => f
Not f => v f or f => f f or v => v v or f => v
v or v => v f and f => f f and v => f v and f => f v and v => v
NOT V or V and f => che valore ha (booleano) f or f => f (risolvo prima il not, poi and ed infine or NOT (V or V and f) => che valore ha (booleano)
NOT (V or f) (risolvo prima l'and , poi l'or ed infine il not Not V => F
le costanti di tipo data ora sono delimitate da #.
E' errato usare i doppi apici. Il mese va scritto prima del giorno del mese Esempio
#12/31/2017#
errato
"31/12/2017"!!!
4T 2/2/2017
"20/12/2017" esempio di rappresentazione di una data con una stringa 20122017 esempio di rappresentazione di una data con un nr intero
le date in ACCESS sono il nr di gg rispetto al 31/12/1899 vantaggi:
1) l'ordinamento numerico è compatibile con quello cronologico
data1 > daTA2 <=> nrggrispettoalladatadiriferimento(data1) > nrggrispettoalladatadiriferimento(data2) 2) oggi+1 => domani
oggi-1 => ieri
data1 - data2 => nr gg trascorsi tra le 2 date
ovvero la semantica degli operatori + e - è adatta anche a dati temporali
svantaggio => la data è illeggibile dal punto di vista umano. E' il sw che trasforma l'informazione illeggibile in una modalità umanamente comprensibile.
in openbase le date sono rappresentate come stringhe
"aaaa-mm-gg"
vantaggi
1) ordinamento cronologico e lessicografico (è la tabella ascii che determina il confronto) sono compatibili data1 > data2 <=> "aaaa1-mm1-gg1" > "aaaa2-mm2-gg2"
2) leggibilità del dato svantaggio
1) la semantica degli operatori + e - non è adatta alla rappresentazione dei dati temporali
"2015-12-31"+"1" => "2015-12-311" che non è domani
sarà il sw (openbase) a porre rimedio effettuando dei suoi calcoli interni
4/2/2017 - 4O riprendere esempio 1 date
Operatore di confronto usato solo per le stringhe. poichè in windows * indica "qualsiasi sequenza" seguono i seguenti esempi
campo like "A*" => tutti i record la cui proprietà "campo" inizia per A
campo like "*A*" => tutti i record la cui proprietà "campo" contiene la lettera A campo like "*A" => tutti i record la cui proprietà "campo" finisce per A
Elenco dei clienti che sono società in nome collettivo SELECT * FROM CLIENTI WHERE [ragione sociale] like "*snc"
Elenco delle società con ragione sociale che inizia con ROs SELECT * FROM CLIENTI WHERE [ragione sociale] like "Ros*"
Elenco delle società con ragione sociale che contiene ss SELECT * FROM CLIENTI WHERE [ragione sociale] like "*ss*"
Le ricerche in access non sono case sensitive
in tutti gli altri db l'* è sostituito con il carattere %
campo like "A%" => tutti i record la cui proprietà "campo" inizia per A
campo like "%A%" => tutti i record la cui proprietà "campo" contiene la lettera A campo like "%A" => tutti i record la cui proprietà "campo" finisce per A
11/2/2016 - 4Q - 2 MODULO
da e01692
ESEMPI DI QUERY PARAMETRICHE
SELECT * from clienti where [ragione sociale]=xx
il suo comportamento è il seguente: xx non è un campo per cui access tenta di valorizzarlo mostrando una richiesta intitolata con xx. L'utente che non sa il significato di xx rimane chiaramente interdetto.
SELECT * from clienti where [ragione sociale]=[dammi la ragione sociale]
la finestra che appare rende evidente la richiesta per cui l'utente può inserire il dato richiesto con cognizione di causa. Sfruttando questo particolare comportamento di access possiamo costruire delle qry che mostrano un risultato # a seconda dell'input dell'utente.
ATTENZIONE:
SELECT * from clienti where [ragione sociale]="dammi la ragione sociale"
questa non è una qry parametrica poichè "dammi la ragione sociale" è una stringa (mostrerà eventualmente una società [se esiste!] la cui ragione sociale è: "dammi la ragione sociale")
Esempi di qry parametriche:
SELECT * FROM Clienti
WHERE ([Ragione Sociale] like [dammi la lettera iniziale] & "*");
SELECT * FROM Clienti
WHERE ([Ragione Sociale] like "*" & [dammi la lettera finale]);
Inviato: 11/02/2017, 11:00
SELECT * FROM Clienti
WHERE ([Ragione Sociale] like "*" & [dammi la lettera contenuta] & "*");
vi ricordo che & è l'operatore di concatenazione
"Marco " & "Bianchi" => "Marco Bianchi"
Ricerca per ragione sociale contenente una determinata stringa digitata all'interno di una opportuna finestra di dialogo.
SELECT * FROM Clienti
WHERE ([Ragione Sociale] like "*" & [dammi parte della ragione sociale] &
"*");
3/2/2017 4T
riprendere esempio 14
Esempio: elenca tutti i clienti mettendo in un'unica colonna i 2 campi Rag.Soc e Provincia
SELECT [ragione sociale] & " - " & prov as [riferimento cliente]
FROM clienti
data di nascita dello studente + vecchio select min([natoil]) from studenti data di nascita dello studente + giovane select max([natoil]) from studenti fatturato medio:
SELECT avg(fatturato) as [media fatturato]
FROM clienti fatturato totale
SELECT sum(fatturato) as [fatturato totale]
FROM clienti
la varianza è una misura statistica che esprime la variabilità di un fenomeno. Più è elevata la varianza maggiori sono le oscillazioni.
Più è bassa + il comportamento è prevedibile
la Varianza è +/- è la media delle distanze dei valori osservati rispetto alla loro media.
GROUP BY => elimina le istanze duplicate
Esempio: province che hanno almeno un cliente (senza duplicati) SELECT prov
FROM clienti group by prov
Estraggo il nr di clienti per provincia SELECT prov, count(*) as nr
FROM clienti group by prov
4O - 6/2/2017 - riprendere dalle qry di raggruppamento SELECT sum(fatturato) as [totale fatturato] from clienti where prov<>"bs"
select classi from studenti group by classe where idprofe=111
elenco le classi del profe che ha matricola 111
distribuzione dei clienti per provincia
SELECT prov, count(*) as nr from clienti group by prov nr di studenti per classe
select classi, count(*) as nr from studenti group by classe
media comportamento per classe
select classi, avg(comportamento) as [media voto di comportamento]
from studenti group by classe 4T 09/02/2017
ripetere differenza tra having e where
Mostro il codice ascii della prima lettera di quel campo SELECT Asc(nominativo) , nominativo
FROM alunni;
mid(Campo,1,1) => estraggo il primo char del campo passato come argomento mid(Campo,len(Campo),1) => estraggo l'ultimo char del campo passato come argomento
mid(Campo,i,1) => estraggo l'i-esimo char del campo passato come argomento
mid(Campo,3) => estraggo la sottostringa ottenuta omettendo i primi 2 char (dal terzo in poi)
Assegnato eser 2.1.A (escluso elemento i) 4T 10/2/2017 (proseguire da instr)
se la matricola contiene l'id della scuola nei primi 3 char della
matricola avremo che l'elenco degli studenti del leonardo è ottenibile in questo modo:
SELECT * FROM ALUNNI WHERE matricola like "LEO*"
oppure
SELECT * FROM ALUNNI WHERE left(matricola,3)="LEO"
Per estrarre tutte le società per azioni
SELECT * FROM Clienti WHERE RagSoc like "*SPA"
oppure
SELECT * FROM Clienti WHERE Right(RagSoc,3)="SPA"
mid("17/12/2017",4,2) =>12
Sintassi INSTR => INSTR(frase,cosacerco) => semantica => restituisce la posizione della 1° occorrenza di cosacerco in frase. Se non trova restituisce zero
Esempio
instr("Arrivederci","i") => 4 instr("Arrivederci","I") => 4 instr("Arrivederci","x") => 0
Sintassi INSTRREV => INSTRREV(frase,cosacerco) => semantica =>
restituisce la posizione dell'ultima occorrenza di cosacerco in frase Esempio
instrrev("Arrivederci","i") => 11
14/2/2017 - 4Q - 2 MODULO
da e01692
Mostrare l'esempio escluso la 4Q --- esempio con + statistiche
SELECT min(fatturato) as [minimo incassi], max(fatturato) as [massimo incassi], avg(fatturato) as media
FROM clienti
---
ricerca tutti i clienti che nella rag.soc. contengono la sottostringa SPA select * FROM CLIENTI WHERE [Ragione Sociale] like "*SPA*"
equivalente a:
select * FROM CLIENTI WHERE Instr([Ragione Sociale],"SPA")<>0
Con questa istruzione restituisce la posizione dello spazio instr("Sechi Marco"," ")
quindi questa istruzione
left("Sechi Marco",instr("Sechi Marco"," ")-1) estrae il cognome
In generale se ho un campo nominativo (cognome+spazio+nome) posso estrarre il cognome in questo modo (il -1 serve per escludere lo spazio!) left(Nominativo,instr(Nominativo," ")-1)
i nomi dei files sono i loro percorsi assoluti (parto dall'unità logica ed arrivo al nome finale del file preceduto da tutte le cartelle intermedie che devo attraversare per giungere a destinazione).
C:\app.sechi\Appunti2016\2MODULO\pluto.png
Inviato: 14/02/2017, 10:02
C:\app.sechi\Appunti2016\1MODULO\pluto.png
Vediamo come estrarre il nome ridotto del file e la cartella che lo contiene
Posizione ultimo \:
instrrev("C:\app.sechi\Appunti2016\2MODULO\pluto.png","\") Percorso della cartella che contiene il file:
left(Percorso,InstrRev(Percorso,"\")-1) ed ottengo
C:\app.sechi\Appunti2016\2MODULO
Per quanto riguarda il nome del file ridotto come nel nome del campo nominativo avrò:
mid(Percorso,InstrRev(Percorso,"\")+1)
Rendo maiuscola la prima lettera, minuscola tutte le altre Ucase(left(Nome,1)) + lcase(mid(Nome,2))
equivale a:
Ucase(left(Nome,1)) & lcase(mid(Nome,2))
space => usato nei formati a larghezza fissa utilizzato per lo scambio di dati tra 2 sistemi
space(5) è equivalente a: string(5," ")
replace(classe,"4Q","5Q") nr di A presenti in Cognome
Nr char originali meno il nr di char senza la lettera A len(Cognome)-len(replace(cognome,"A",""))
Le funzioni di conversione (clng, cdbl, cdate, cstr) rendono esplicito il tipo da utilizzare da parte dell'interprete del linguaggio
Nel caso di numeri con decimali arrotonda clng(1.34) => 1
clng(1.7) => 2 clng("1.7") => 2
4O 13/2/2017 ---
riprendere da fix 1+3=4
"1"+"3"="13"
Nr di studenti per giorno della settimana di nascita
SELECT format(DataDiNascita,"dddd") as [giorno settimana], count(*) from
alunni group by format(DataDiNascita,"dddd") esempio:
SELECT format(date(),"y") => mostra il nr di gg dal 1/1 dell'anno corrente
17/2/2017 - 4Q - 2 MODULO
da e01692
riprendere dal formato delle ore
format(now(),"dddd, d mmmm yyyy \o\r\e hh.nn.ss") venerdì, 17 febbraio 2017 ore 08.21.44
format(now(),"dddd, d mmmm yyyy ""ore"" hh.nn.ss")
Il " è il limitatore relativo alle stringhe. Se in una stringa inserisco un "" indico che non deve essere interpretato come termine della stringa ma come un doppio apice.
Esempio se scrivo
"Nave ""BS""" => mostrerà Nave "BS"
"""" => mostrerà " (il primo " => inizio stringa - "" => doppio apice "
- Ultimo " => fine stringa) se scrivo
"Nave "BS" => mostrerà un errore => il " davanti a BS viene interpretato come fine stringa
FORMATi per i numeri
SELECT format(idcliente,"0000") as ID, Format(fatturato,"€ #,##0.00") AS [Fatturato in euro]
FROM clienti;
Separatore delle migliaia e della parte decimale invertito
ATTENZIONE => format restituisce una stringa. Quindi gli eventuali simboli che vengono visualizzati sono realmente presenti contrariamente alla maschera di formato applicata ai campi (vista nel 1 modulo) che fornisce solo un effetto visivo e non modifica assolutamente i contenuti.
format(1000.014,"#,##0.00 \L\i\r\e") oppure
format(1000.014,"#,##0.00 ""Lire""")
format(100,"00000") => "00100"
Inviato: 17/02/2017, 7:57
questo tipo di format è usato per garantire compatibilità tra ordinamento numerico e lessicografico
"123" < "9"
ma
"00123">"00009"
format("ciao",">") equivale a Ucase("ciao") format("CIAO","<") equivale a Lcase("CIAO")
format(Stringa,STRING(N,"@")) => Crea una stringa di n char inserendo all'inizio della stringa N-len(stringa) spazi
format(Stringa,"!" & STRING(N,"@")) => Crea una stringa di n char inserendo alla fine della stringa N-len(stringa) spazi
format("Ciao","@@@@@@") => " Ciao"
format("Ciao","!@@@@@@") => "Ciao "
format("Ciao","@@@@@@") equivale a space(len("@@@@@@")-len("Ciao")) & "Ciao"
format("Ciao","!@@@@@@") equivale a
"Ciao" & space(len("@@@@@@")-len("Ciao"))
Funzione IIF
simile al SE di Excel
iif(condizione,rispostaseCondizioneVERA,rispostaseCondizioneFALSA) esempio
SELECT iif(fatturato<1000,"Cliente loffe","Cliente che merita!") FROM clienti;
Nz(arg,rispostasenullo) equivale a:
iif(isnull(arg),rispostasenullo,arg)
Null è il valore di una variabile che non è stata mai valorizzata. Lo vedremo nelle qry multitabella.
Le funzioni che iniziano con IS sono di test e vengono solitamente usate nella IIF o nella clausola WHERE
isnull(null)
Media dei voti complessiva se nel campo voti inserisco anche simboli non numerici (esempio + => bonus , - penalty, * esercit. controllata etc...).
chiaramente il campo VOTO è testuale e contiene numeri solo se si tratta
di una verifica vera e propria.
SELECT AVG(Voto) From Interrogazioni where isnumeric(voto)
18/2/2017 - 4Q - 2 MODULO
da e01692
riprendere dalle funzioni di tipo cronologico select * from alunni where year(NatoIl)=2017 oppure
select * from alunni where natoIl>#12/31/2016 AND natoIl<=#12/31/2017 Nati ultimo gg del mese
SELECT * FROM Studenti WHERE Month(NatoIl)<>Month(NatoIl+1)
Nati il 29/2 di un qualsiasi anno
SELECT * FROM Studenti WHERE Month(NatoIl)=2 AND DAY(NatoIl)=29 SELECT * FROM Studenti WHERE format(NatoIl,"ddmm")="2902"
Studenti nati di domenica
SELECT * FROM Studenti WHERE Weekday(NatoIl)=1 oppure
SELECT * FROM Studenti WHERE format(NatoIl,"w")="1"
oppure (non valida in versioni di Access non italiche)
SELECT * FROM Studenti WHERE format(NatoIl,"dddd")="domenica"
nr di secondi trascorsi/mancanti alla fine/inizio gg trascorsi
hour(now())*60*60+minute(now())*60+second(now()) mancanti
24*60*60 -(hour(now())*60*60+minute(now())*60+second(now()))
Query multitabella
Se un campo della query appare con lo stesso nome in + tabelle elencate nel from allora devo mettere davanti al nome del campo "Nometabella."
(risolvo quindi possibili incomprensioni dell'interprete SQL) DIRECT JOIN
Le relazioni 1-N implementano una proprietà multipla della tabella master Quando devo verificare chi possiede una caratteristica implementata nella tabella slave B devo seguire questo modello:
SELECT A.*, B.*
FROM A,B
WHERE A.idMaster=B.idMaster
Nominativo degli studenti con almeno una assenza:
SELECT Nominativo FROM Studenti, Assenze
where Studenti.id=Assenze.idStudente Group by Nominativo
Questo tipo di query nota come direct (o inner) join mostrerà al massimo
Inviato: 18/02/2017, 11:01
N righe dove N è la cardinalità della tabella slave.
Ogni record master che ha m record associati in B apparirà m volte nell'esecuzione della query
21/2/2017: 4Q - 2 MODULO
da e01692
LEFT JOIN
Quando devo verificare chi non possiede una caratteristica implementata nella tabella slave B devo seguire questo modello:
SELECT A.*, B.*
FROM A LEFT JOIN B ON A.idMaster=B.idMaster
per estrarre chi non possiede una determinata proprietà (implementata nella tabella slave)
SELECT A.*, B.*
FROM A LEFT JOIN B ON A.idMaster=B.idMaster where B.idMaster is null oppure
SELECT A.*, B.*
FROM A LEFT JOIN B ON A.idMaster=B.idMaster where isnull(B.idMaster)
Nominativo degli studenti con nessuna assenza:
SELECT Nominativo
FROM Studenti left join Assenze on Studenti.id=Assenze.idStudente Where IsNull(Assenze.idStudente)
Media voti di ogni studente con almeno un voto SELECT NOminativo, AVG(voto) as MediaVoti FROM studenti,verifiche
WHERE studenti.id=verifiche.idstudente GROUP BY Nominativo
Elenco fatturato per ogni cliente (anche chi non ha acquisti) SELECT [ragionesociale],sum(nz(importo,0)) as fatturato from clienti left join testatefatture
on clienti.idcliente=testatefatture.idcliente group by [ragionesociale]
Vi ricordo che la LEFT JOIN estrae tutti i record della tabella master e solo i record collegati della tabella slave!
Inviato: 21/02/2017, 10:02
DOMANDA: conteggio fatture per ogni cliente (anche chi non ha fatto acquisti). Il risultato che ottengo con questa qry è errato
SELECT [ragionesociale],count(*) as nrfatture from clienti left join testatefatture
on clienti.idcliente=testatefatture.idcliente group by [ragionesociale]
poichè la società F.lli Bandiera, che non ha fatto alcun acquisto, appare con un 1 in sua corrispondenza.
la soluzione corretta è la seguente:
SELECT [ragionesociale],sum(iif(isnull(testatefatture.idcliente),0,1)) as nrfatture
from clienti left join testatefatture
on clienti.idcliente=testatefatture.idcliente group by [ragionesociale]
sommo 0 se il campo della tabella slave è nullo (quindi non ho un record slave corrispondente!) altrimenti 1 (e quindi equivale al conteggio)
24/2/2017 - 4Q - 2 MODULO
da e01692
schemi LEFT JOIN e DIRECT JOIN 24/2/2017 4T
riprendere dalla nojoin
Estrae tutte le coppie possibili tra i record A e B appartenenti alle 2 tabelle indicate nel from
Se N è la cardinalità della tabella A e M è la cardinalità della tabella B il massimo numero di righe che verranno estratte è NxM
SELECT A.*, B.* FROM A, B righe con
campi di A - campi di B
1 record di A viene abbinato a tutti gli M record di B (M repliche di A) 2 record di A viene abbinato a tutti gli M record di B (M repliche di A) ...
N record di A viene abbinato a tutti gli M record di B (M repliche di A) quindi NxM righe
Le nojoin permettono l'estrazione di tutte le combinazioni di coppie di record prese dalle 2 tabelle
Inviato: 25/02/2017, 10:59
DOMANDA SULLE QRY DI CREAZIONE:
esempio
creami una tabella studenti con matricola (numerico) - Nominativo (testo di 30 caratteri) - foto (ole) e Osservazioni (MEMO)
1) Identificare il campo chiave come nel 1° modulo e mettere il constraint NomeVincolo Primary Key
2) Identificare il campo significativo come nel 1° modulo e mettere obbligario l'inserimento con constraint NomeVincolo not null
i restanti campi vanno creati seguendo le regole di naming viste in testa agli appunti.
create index => consente di creare un indice quando la tabella esiste ed è popolata da record (la create table mi elimina l'intero contenuto!) IGNORE NULL => negli indici usare questa clausola consente di indicizzare solo gli elementi valorizzati (quindi essendo il set di record inferiore sono + veloce nell'estrazione dei dati).
4/3/2017 - 4Q - 2 MODULO
da e01692
riprendere da QUERY DI MANIPOLAZIONE DEI DATI
le query di creazione tabella da selezione (INTO NOMETABELLA) vengono usate per riversare dati prodotti da una query di selezione all'interno di una tabella transitoria che poi viene usata successivamente in ulteriori query
Le query di accodamento riversano nella tabella indicata dopo "INSERT INTO" i dati prodotti dalla query di selezione scritta dopo.
In questo caso la tabella di destinazione deve esistere
Le qry di accodamento sono utili ad esempio all'inizio dell'anno per aggiungere i nuovi iscritti.
INSERT INTO traduzione ( ita, uk ) SELECT Vocabolario.ita, Vocabolario.uk
INSERT INTO traduzione ( ita, uk ) VALUES ("Barca","boat")
DOMANDA : inserire il tuo nominativo all'interno della tabella studenti con la data di nascita:
Inviato: 04/03/2017, 11:15
RISPOSTA
INSERT INTO Alunni (Cognome, Nome, NatoIl) VALUES ("Rossi", "Mario",", #12/31/2010#) FROM Vocabolario
where ita like "h*"
Comandi di eliminazione. Utili per gli studenti di quinta promossi che se ne vanno
DELETE FROM traduzione where ita like "h*"
4T 3/3/2017
DOMANDA => rincara del 10% tutti i prodotti alimentari UPDATE PRODOTTI
SET Prezzo=Prezzo*1.1 WHERE genere="alimentari"
UPDATE Studenti SET classe="5Q"
WHERE classe="4Q" AND Promosso
con UNION ALL i risultati delle n query vengono uniti (accodati) senza ricercare eventuali valori duplicati e quindi sono molto veloci
con UNION senza ALL i risultati delle n query vengono uniti (fusi) eliminando eventuali valori duplicati (richiede quindi una ricerca!!!) e quindi sono molto lente
DIrect JOIN
SELECT TabellaA.* FROM TabellaA,TabellaB WHERE TabellaA.IDA =TabellaB.IDA
GROUP BY TabellaA.*
con le sottoquery diventa
SELECT TabellaA.* FROM TabellaA
WHERE TabellaA.IDA IN (SELECT TabellaB.IDA FROM TabellaB)
Left JOIN
SELECT TabellaA.* FROM TabellaA LEFT JOIN TabellaB ON TabellaA.IDA =TabellaB.IDA
WHERE TabellaB.IDA is null
con le sottoquery diventa
SELECT TabellaA.* FROM TabellaA
WHERE TabellaA.IDA NOT IN (SELECT TabellaB.IDA FROM TabellaB)
7/3/2017 - 4Q - 2 MODULO
da e01692
Query FULLTEXT => sono usate dai motori di ricerca. La ricerca avviene in modo trasversale in tutti i campi della tabella.le ricerche fulltext
necessitano di indici particolari che permettono la ricerca contemporanea su + campi.
Access non gestisce in modo nativo le query fulltext ma è necessario effettuare la ricerca campo per campo.
Esempio:
SELECT * FROM Vocabolario WHERE
(Italiana Like "*AGENT*") OR (Spagnolo Like "*AGENT*") OR (Tedesco Like "*AGENT*") OR (Inglese Like "*AGENT*") OR (Olandese Like "*AGENT*") OR (Francese Like "*AGENT*")
Le query fulltext in access sono quindi sequenziali e pertanto molto lente
le query incrociate mettono in relazione 2 grandezze.
Esempio Righe studenti, colonne materie, incrocio => media voti
Esempio Righe prodotti, colonne regioni, incrocio => fatturato per quella regione relativo a quel prodotto
Esempio Righe patologie, colonne quartieri, incrocio => conteggio relativo a quella patologia per quel quartiere
4O - 7/3/2017
formato files => modalità di salvataggio dell'informazione utilizzata da un particolare prg
formato nativo => formato predefinito di salvataggio di una particolare applicazione
importazione => consente l'acquisizione di documenti da parte di prg che non hanno un determinato formato tra quelli nativi.
Formato portabile => leggibile da qualsiasi sistema
formato chiuso => modalità di salvataggio dei dati i cui dettagli tecnologici non vengono resi disponibili o sono soggetti a brevetti.
Per importare un documento scritto con un formato chiuso devo ricorrere a tools di importazione venduti solitamente da chi ha inventato quel
Inviato: 07/03/2017, 9:58
particolare formato
formato aperti => modalità di salvataggio dei dati i cui dettagli
tecnologici vengono resi disponibili a tutti. Chiunque abbia il know how adatto può produrre dei tools di importazione per tali formati.
file testuali => file il cui contenuto è interpretato come sequenza di byte interpretati secondo la codifica ascii. I files prodotti da Notepad sono file testuali. In altre parole del testo privo di caratterizzazioni tipografiche
un file è binario se non è testuale. I files di Word non sono testuali (all'interno vi sono specifice relative alla dimensione della pagina, margini, font etc.)
modulo di esportazione => trasforma il formato nativo di un sistema informativo in un file portabile
modulo di importazione => trasforma il formato portabile nel formato nativo riconosciuto da un sistema informativo
arrivato al tabtext compreso
11/3/2017 - 4Q - 2 MODULO
da e01692
BMP => è un formato non compresso
Prerogative IMG GIF max 256 colori
usa compressione non distruttiva supporta la trasparenza
supporta le animazioni
le img possono essere interlacciate
il nr di colori basso lo rende poco adatto alle img fotografiche.
E' adatto per clipart (immagini a fumetto)
la compressione non distruttiva consente di ottenere un file identico
(come qualità) a quello in BMP ma con una dimensione in byte decisamente + contenuta.
spiegato interlacciamento - quando è utile ? come funziona ? esempi di compressione non distruttiva
Inviato: 11/03/2017, 10:00
compressione RLE:
FILE ORIGINALE:
aaaaabbbbhhaaaaaaaaa => 20 char FILE Compresso:
^5a^4bhh^9a => 11 char => ho diminuito la dimensione mantenendo lo stesso contenuto.
Ogni singola sequenza ripetuta dello stesso simbolo viene sostituita con un carattere speciale (esempio ^) + nr di occorrenze + simbolo che devo ripetere
compressione HUFFMAN:
100.000 pixel con 4 possibili tonalità 00 NERO
01 BIANCO 10 ROSSO 11 VERDE
non compresso occupa 200.000 bit
supponiamo che il rosso sia l'80% dei pixel
cambio la codifica. Al colore > associo un solo bit 1 ROSSO
000 NERO 001 BIANCO 011 VERDE
il bit iniziale permette all'algoritmo di intuire quale rappresentazione usare. Quindi la sequenza.
100000101110011 viene letta:
1 000 001 011 1 001 1
Inrterlacciato => modalità che crea l'immagine in modo non sequenziale (dalla 1° all'ultima riga dell'immagine) ma inviando al client una riga ogni N righe. In questo modo il contenuto dell'img può essere
interpretato meglio fin da principio.
Gli 80.000 pixel rossi richiedono un solo bit mentre i restanti 20000 (altri colori) ne richiedono 3. Pertanto:
80000+3*20000 =140.000
Prerogative IMG JPG
1) compressione distruttiva (tasso di compressione molto elevato) 2) palette personalizzabile (quindi adatta alle foto)
Compressione distruttiva => si basa sull'incapacità umana di rilevare lievi variazioni di colore (idem nell'mp3 dove si sfrutta l'incapacità dell'udito di rilevare determinate frequenze audio).
Un'img compressa in JPG ha una qualità inferiore a quella bmp di partenza ma una dimensione enormemente ridotta.
il JPG non è adatto alle img al tratto (clipart o fumettO) poichè la continua sostituzione dei colori in tonalità equivalenti rende 'immagine loffe! Il JPG è usato nelle img fotografiche.
La compressione GIF sfrutta o la riduzione del nr di colori o la ripetitività di un colore all'interno dell'img. Quindi un img con tanti colori e elevata variabilità in GIF non fornirà mai un elevato tasso di compressione
PNG => evoluzione del GIF. Supporta internamente del testo per cui posso effettuare nelle img delle ricerche. Il png nella modalità standard non supporta le animazioni ed arriva a 32 bit di profondità di colore.
Prerogative PNG
>> PNG => usa una compressione non distruttiva
>> Profondità di colore => fino a 32 bit (usabile in fotografia ma non ha la medesima potenza del JPG in termini di compressione
>> Supporta internamente del testo per cui posso effettuare nelle img delle ricerche.
>> png non è soggetto a brevetti (il gif li aveva ma ora sono scaduti)
>> supporta la trasparenza
ALGORITMI DI COMPRESSIONE NON DISTRUTTIVA => usano un cambio di codifica per ridurre le dimensioni
ALGORITMI DI COMPRESSIONE DISTRUTTIVA => usano limiti sensoriali umani per ridurre le dimensioni
3T 9/3/2017
TIFF => formato usato per la stampa(quindi le img sono di qualità!) 1) usa un algoritmo di compressione non distruttivo LZW
2) supporta le multipagina
Fino ad adesso abbiamo analizzato img bitmap (mappe di pixel) IMMAGINI VETTORIALI
Le img sono descritte mediante primitive geometriche (esempio un cerchio rosso come coordinate del centro + raggio).
VANTAGGI
1) se le img che devo descrivere sono semplici posso descriverle con
poche primitive => file di piccole dimensioni
2) la qualità è sempre la migliore indipendentemente dalla device che uso (avendo delle funzioni matematiche mi basta effettuare un ricalcolo per ottenere la massima qualità rispetto alla risoluzione della periferica usata)
SVANTAGGI
1) se l'img è complessa il nr di primitive da utilizzare è altissimo =>
file con dimensione > rispetto al corrispondente BMP
Il formato raw è un formato intermedio usato in fotografia che unisce le 2 modalità BMP e Vettoriale
11/3/2017 4Q - 2 MODULO
da e01692
Spiegato tracciato file in fixed format.
xlsx e accdb sono formati binari (solitamente i binari non sono
portabili!). La loro ampia diffusione permette di utilizzare tali formati come formati di interscambio.
Nelle stampanti il driver rappresenta il traduttore tra il set di comandi generici di SO che pilotano una stampante virtuale e il set di comandi reali della stampante effettivamente installata.
Nelle database l'ODBC rappresenta il traduttore tra un set di comandi generici di SO che pilotano un database virtuale e il set di comandi reali usati dal DB effettivamente installato.
4Q 11/3/2016
Quando uso i formati di interscambio:
1) per travasare i dati da un db ad un altro per effettuare un'analisi dei dati.
2) per registrare in un unico contenitore dati che vengono prodotti da # postazioni utente
QUANDO USO L'IMPORTAZIONE:
1) poichè i dati sono posti in strutture reali di access posso sfruttare
Inviato: 11/03/2017, 11:01
tutte le funzionalità offerte da un DB (tipizzazione dei dati =>
ordinamenti corretti, indici => ricerche veloci)
2) essendo all'interno di un file di access eventuali modifiche apportate dal sistema sorgente (quello che ha prodotto il file di interscambio) non vengono recepite all'interno della tabella importata se non reimportando i dati
=> utile quindi quando devo effettuare query pesanti che fanno grosso uso di indici e non è importante avere i dati aggiornati fino all'ultimo
istante
QUANDO USO IL COLLEGAMENTO:
1) poichè i dati non sono posti in strutture reali di access non posso sfruttare tutte le funzionalità offerte da un DB (tipizzazione dei dati
=> ordinamenti corretti, indici => ricerche veloci) e pertanto le query saranno molto lente
2) essendo all'esterno di un file di access eventuali modifiche apportate dal sistema sorgente (quello che ha prodotto il file di interscambio) vengono recepite immediatamente da access
=> utile quindi quando devo avere dati sempre aggiornati .
Per importare i dati di una tabella collegata si usano solitamente le query di creazione da selezione o di accodamento
Mostrato il collegamento con i files binari
La freccia in parte all'icona indica che si tratta di una tabella collegata.
14/3/2017 - 4Q - 2 MODULO
da e01692
Collegare una tabella di access risulta utile perchè ?
1) consente di mantenere aggiornati i dati quando la componente prg viene aggiornata con nuove funzionalità.
2) per connettere un db condiviso tra + utenti al client che contiene solo la componente prg (slide 13 di "Formato file")
DB SERVER
Non hanno componenti per costruire l'interfaccia applicativa.
Il frontend (interfaccia utente) dei DB server fornisce strumenti per la definizione degli archivi, ottimizzazione degli indici e funzioni di
Inviato: 14/03/2017, 10:04
Tutti gli orari sono UTC Pagina 1 di 1
ricerca mediante SQL).
I db server consentono la definizione di policies (diritti di accesso) a livello utente (esempio il docente può consultare e modificare i voti, lo studente solo leggerli).
cosa significa il mappamondo all'interno delle tabelle ? si tratta di una tabella di un db server connessa mediante ODBC. Qualsiasi operazione svolta su tale tabella verrà immediatamente aggiornata sul DB server.
14/3/2017 - 4Q - 2 MODULO
da e01692
Collegare una tabella di access risulta utile perchè ?
1) consente di mantenere aggiornati i dati quando la componente prg viene aggiornata con nuove funzionalità.
2) per connettere un db condiviso tra + utenti al client che contiene solo la componente prg (slide 13 di "Formato file")
DB SERVER
Non hanno componenti per costruire l'interfaccia applicativa.
Il frontend (interfaccia utente) dei DB server fornisce strumenti per la definizione degli archivi, ottimizzazione degli indici e funzioni di ricerca mediante SQL).
I db server consentono la definizione di policies (diritti di accesso) a livello utente (esempio il docente può consultare e modificare i voti, lo studente solo leggerli).
cosa significa il mappamondo all'interno delle tabelle ? si tratta di una tabella di un db server connessa mediante ODBC. Qualsiasi operazione svolta su tale tabella verrà immediatamente aggiornata sul DB server.
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/
Inviato: 14/03/2017, 10:04