Tutte le categorie
Impariamo a programmare con JavaScript - Lezione 3
Gino Visciano |
Skill Factory - 23/05/2016 00:07:52 | in Tutorials
Benvenuti alla terza lezione, in questa lezione imparerete a dichiarare le variabili in JavaScript e ad utilizzare la struttura condizionale if - else.
Che cos'è una variabile?
Una variabie è una posizione di memoria in cui è possibile memorizzare un'informazione. I nomi delle variabili devono iniziare sempre con una lettera e non devono contenere spazi, ad esempio:
<script type="text/javascript">
var a, nome, b1; // sono nomi di variabili corretti
var nome e cognome, 1a; //sono nomi di variabili non corretti
</script>
Come si assegna un valore ad una variabile?
In tutti i linguaggi di programmazione l'operatore per assegnare un valore ad una variabile è il segno uguale "=". Attenzione, in Javascript, le variabili diventano dello stesso tipo del primo valore assegnato, ad esempio:
<script type="text/javascript">
var valore_intero, valore_decimale, valore_alfanumerico;
valore_intero=10; // La variabile valore_intero diventa di tipo intero, perché il primo valore assegnato è un numero di tipo intero
valore_decimale=20.5; // La variabile valore_decimale diventa di tipo decimale, perché il primo valore assegnato è un numero di tipo decimale
valore_alfanumerico="Rossi Alberto"; // La variabile valore_alfanumerico diventa di tipo alfanumerico, perché il primo valore assegnato è un numero di tipo alfanumerico, i valori alfanumerici di chiamano stringhe e vanno sempre scritti tra doppi apici
</script>
Quali sono i tipi di dati che si possono assegnare alle varibili in Javascript?
Interi, ad esempio:
1, 100, 12, 1000;
Decimali, ad esempio:
1.2, 10.0, 12.45, 1000.50, i valori decimali si indicano dopo il punto;
Caratteri, ad esempio:
'1', '0', '2', 'A', 'b', '?', '!', '.', i caratteri vanno scritti sempre tra apici;
Stringhe, ad esempio:
"Rossi", "Lazio", "Via Roma, 10", "1990", le stringhe vanno scritte sempre tra doppi apici;
Booleani, ad esempio:
True, False;
Date, ad esempio:
new Date("10/05/2016"), in Javascript le date sono oggetti e si creano con la classe Date, ad esempio var data_nascita=new Date("20/09/1990").
Adesso impariamo ad usare la prima struttura di programmazione:
Struttura di programmazione: if - else
La struttura if - else è una struttura condizionale che permette di eseguire blocchi d'istruzioni diversi, in base ad una condizione di scelta che può essere vera oppure falsa, il diagramma di flusso seguente mostra graficamente il comportamento di una struttura di scelta:
Esempio 1
Vogliamo creare un'applicazione Javascript che indica se un numero inserito è pari oppure dispari.
Per capire se un numero è pari oppure dispari, basta dividerlo per 2 e vedere se l'operazione restituisce un resto. Il numero è dispari se la divisione ha il resto altrimenti il numero è pari, questo risultato si ottine con la formula seguente:
num%2
dove % (modulo) è l'operatore matematico che restituisce il resto di una divisione.
Attenzione in Javascript si definisce blocco d'istruzioni, un insieme d'istruzioni racchiuse tra parentesi graffe {...}.
Di seguito il programma pari_dispari.html con il codice Html/Javascript per visualizzare se un numero è pari oppure dispari.
<!-- pari_dispari.html -->
<html>
<head>
<script type="text/javascript">
var str_numero = prompt("Inserisci un numero:","Pari o Dispari"); // Prompt permette d'inserire un valore di tipo stringa, in questo caso lo usiamo per inserire il numero
var numero=parseInt(str_numero); // La funzione parseInt converte il numero di tipo stringa in tipo intero
var soluzione;
if (numero%2==0){
soluzione="Il numero è pari";
} else {
soluzione="Il numero è dispari";
}
alert(soluzione); // Visualizza se il numero è pari oppure dispari
</script>
</head>
</html>
La struttura condizionale if - else, può gestire anche più condizioni di scelta contemporaneamente, in questo caso si usa la forma if - else if - else.
Esempio 2
Vogliamo creare un'applicazione per indicare ad un guidatore come deve comportarsi quando incontra un semaforo. In questo caso la struttura if - else non basta, perché le scelte sono più di due:
Il diagramma di flusso seguente mostra graficamente l'algoritmo che permette di gestire il semaforo:
Di seguito il programma semaforo.html con il codice Html/Javascript per indicare ad un guidatore come deve comportarsi quando incontra un semaforo.
<!-- semaforo.html -->
<html>
<head>
<script type="text/javascript">
var colore_semaforo = prompt("Di che colore è il semaforo?","verde, arancione, rosso"); // Prompt permette d'inserire un valore di tipo stringa, in questo caso lo usiamo per inserire il colore del semaforo
colore_semaforo=colore_semaforo.toLowerCase(); // Il metodo toLowerCase() converte il colore inserito in minuscolo, per evitare di controllare nelle condizioni il caso in cui il colore inserito sia maiuscolo
var soluzione;
if (colore_semaforo=="verde"){
soluzione="ATTRAVERSA";
} else if (colore_semaforo=="arancione") {
soluzione="ATTENZIONE";
} else if (colore_semaforo=="rosso") {
soluzione="ALT";
} else {
soluzione="Inserire uno dei colori seguenti: verde, arancione, rosso";
}
alert(soluzione); // Visualizza come deve comportarsi il guidatore
</script>
</head>
</html>
Arrivederci alla prossima lezione!!!
<< Lezione precedente Lezione successiva >>
T U T O R I A L S S U G G E R I T I
- APP Mania
- Excel delle Meraviglie
- Ricominciamo ... dal Linguaggio SQL
- Come sviluppare un Sito con Wordpress
Impariamo a programmare con JavaScript - Lezione 2
Gino Visciano |
Skill Factory - 22/05/2016 16:07:07 | in Tutorials
Benvenuti alla seconda lezione, nella lezione precedente abbiamo introdotto i concetti di Programma ed Algoritmo ed avete creato il vostro primo programma con JavaScript, in questa lezione cercheremo di capire che cos'è un Linguggio di programmazione.
Un linguaggio di programmazione deve permettere al programmatore di svolgere le seguenti attività:
1) Memorizzare informazioni, sotto forma di variabili oppure array (vettori/matrici);
2) Acquisire (input) oppure visualizzare (output) informazioni;
3) Eseguire calcoli oppure concatenamenti;
4) Fare scelte in base a condizioni predefinite che possono essere vere (true) oppure false (false);
5) Ripetere blocchi d'istruzioni mentre una condizione risulta vera (true) oppure falsa (false);
6) Gestire errori di esecuzione per evitare d'interrompere i programmi in modo anomalo.
Tutti i linguaggi di programmazione permettono la gestione delle attività indicate attraverso l'uso delle istruzioni.
Il programma scritto dal programmatore utilizzando le istruzioni necessarie per implementare l'algoritmo richiesto si chiama sorgente.
Il programma sorgente per essere eseguito deve essere compilato oppure interpretato.
Si parla di compilazione quando il programma sorgente viene tradotto completamente in linguaggio macchina e per eseguirlo si lancia direttamente il programma tradotto.
Questo accade con programmi scritti con linguaggi di programmazione come Cobol, C e C++.
Si parla di interpretazione quando il programma sorgente , per essere eseguito, viene tradotto in linguaggio macchina ogni volta, quindi il programma tradotto non esiste.
Ad esempio i programmi scritti con il linguaggio JavaScript sono interpretati.
Linguaggi di programmazione come Java e C#, sono semi-interpretati, perchè il sorgente viene tradotto in uno pseudo linguaggio macchina, chiamato codice intermedio.
Il codice intermedio viene tradotto ogni volta dalla virtul machine in cui vengono fatti girare i programmi.
Il codice intermedio di Java si chiama Bytecode, quello di C# (C SHARP) si chiama Assembly.
La tabella seguente descrive in sintesi la storia dei principali linguaggi di programmazione:
LINGUAGGIO | ANNO DI RIFERIMENTO | TIPO LINGUAGGIO |
ASSEMBLER | 1940 | ASSEMBLATO |
FORTRAN | 1950 | COMPILATO |
COBOL | 1950 | COMPILATO |
ALGOL | 1960 | COMPILATO |
BASIC | 1960 | INTERPRETATO |
PASCAL | 1970 | COMPILATO |
C | 1970 | COMPILATO |
C++ | 1980 | COMPILATO |
JAVA | 1990 | SEMI-INTERPRETATO |
JAVASCRIPT | 1995 | INTERPRETATO |
C# | 2000 | SEMI-INTERPRETATO |
Arrivederci alla prossima lezione!!!
<< Lezione precedente Lezione successiva >>
T U T O R I A L S S U G G E R I T I
- APP Mania
- Excel delle Meraviglie
- Ricominciamo ... dal Linguaggio SQL
- Come sviluppare un Sito con Wordpress
Impariamo a programmare con JavaScript - Lezione 1
Gino Visciano |
Skill Factory - 21/05/2016 13:26:20 | in Tutorials
Benvenuti alla prima lezione, per cominciare partiamo subito dalle cose semplici e diamo la definizione di Programma: un prograrmma è un insieme d'istruzioni organizzate logicamente, con l'obiettivo di risolvere un problema. I computer usano i programmi per svolgere qualunque tipo di attività.
Un Programma può anche essere definito un Algoritmo, perché attraverso le sue istruzione permette la soluzione di un determinato problema.
La figura seguente mostra, attraverso un Diagramma di flusso, l'Algoritmo per calcolare la potenza di un numero intero.
Nelle prossime lezioni, trasformerete questo Algoritmo in un vero Programma.
Per scrivere un programma serve un Linguaggio di Programmazione, noi usermo JavaScript, perché è semplice, molto diffuso, potente ed in futuro permette di apprendre più facilmente altri linguaggi di programmazione, tipo PHP, Java e C#.
Per scrivere ed eseguire un programma con JavaScript è sufficiente il Blocco note ed un Browser qualunque, ad esempio Chrome, Mozilla oppure Internet Explorer, perché i programmi JavaScript girano all'inteno di pagine html.
Se non conoscete il linguaggio HTML, vi suggerisco di leggere le prime lezioni del Tutorial "Come sviluppare un Sito in Wordpress".
L'esempio seguente, esercizio_01.html, mostra la struttura di un programma JavaScript:
<html>
<head>
<script type="text/javascript">
document.write("Questa è un'istruzione JavaScript");
</script>
</head>
</html>
I TAG <html> e </html> indicano l'inizio e la fine della pagina html, i TAG <script> e </script> indicano l'inizio e la fine del programma JavaScript.
Questo programma visualizza nella pagina del Browser scelto il messaggio: Questa è un'istruzione JavaScript
Per eseguire il programma, posizionatevi nella cartella dov'è stato salvato il programma, selezionate il file esercizio_01.html, premere il pulsante destro del mouse, scegliere la voce Apri con e scegliete uno tra i browser proposti, ad esempio Chrome, come mostra l'immagine seguente.
Se volete commentare il vosto programma, potete usare le tecniche seguenti:
// Commento scritto su una sola riga
oppure
/*
Commento scritto
su più righe
*/
Ad esempio:
<html>
<head>
<script type="text/javascript">
/*
Questo è un esempio di programma
scritto in con JavaScript
*/
document.write("Questa è un'istruzione JavaScript");
// Fine programma
</script>
</head>
</html>
------ OUTPUT -------
Questa è un'istruzione JavaScript
Arrivederci alla prossima lezione!!!
T U T O R I A L S S U G G E R I T I
- APP Mania
- Excel delle Meraviglie
- Ricominciamo ... dal Linguaggio SQL
- Come sviluppare un Sito con Wordpress
App Mania Lezione 10 - Gestione Sprite - III Parte - (Come far girare l'ago di una bussola con il Timer)
Gino Visciano |
Skill Factory - 02/05/2016 21:54:45 | in Tutorials
Benvenuti alla decima lezione, nella lezione precedente avete fatto girare l'ago della bussola sia in senso orario, sia in senso antiorario, usando i pulsanti ruota+ e ruota-, in questa lezione per far girare l'ago utilizzerete il Timer.
Create un nuovo progetto Bussola_Automatica ed eseguite le operazioni seguenti:
1) Trascinate nello Schermo attivo (Screen1) un Canvas e chiamatelo "Piano";
2) Trascinate nel Canvas appena aggiunto due ImageSprite e chimateli "Bussola" e "Ago_Bussola";
3) Trascinate al di sotto del Canvas un Layout orizzontale;
4) Aggiungete al Layout orizzontale tre Button e chimateli "But_Start_piu", "But_Start_meno" e "But_stop";
5) Aggiungete dopo i Button una Label e chiamatela "Lab_timer", la userete per visualizzare il progressivo dell'immagine dell'ago corrente.
Per far girare l'ago della Bussola automaticamente dovete aggiungere allo Schermo, un componente di tipo Clock, è un Non visible component e lo trovate nella categoria Sensors, come mostra l'immagine seguente.
Trascinate il Clock nello Schermo e chiamatelo "Timer".
Utilizzando la sezione Components, selezionate i componenti aggiunti allo Schermo e assegnategli le prorpietà indicate:
Piano
Height: Fill parent
Width: Fill parent
Ago_Bussola
Height: 170 Pixels
Width: 170 Pixels
X: 70
Y: 62
Z: 2
Bussola
Height: 220 Pixels
Width: 220 Pixels
Picture: bussola.png
X: 46
Y: 38
Z: 1
But_Start_piu
Text: Start+
But_start_meno
Text: Start-
But_stop
Text: Stop
Timer
TimerInterval: 300 (indica che il timer se la proprietà TimerEnabled è True, si attiva ogni 300 millisecondi, circa 3 volte al secondo)
Assicuratevi che la proprità TimerEnabled non sia spuntata, stato che corrisponde a False
Per completare le operazioni nell'Area Designer, dovete caricare tutte le immagini che servono per creare l'animazione, come mostra l'immagine seguente:
Come impostare il blocco Timer
Il blocco Timer lo trovate nell'Area Blocks, cliccando sul componete "Timer" a sinistra nella sezione Blocks.
Questo blocco, se la proprietà TimerEnabled è True si attiva ogni 300 millisecondi (come impostato nella proprietà TimerInterval) ed esegue i blocchi associati.
Quando il valore della variabile flag è uguale a zero, viene eseguita la procedura ago_verso_orario, altrimenti viene eseguita la procedura ago_verso_antiorario.
I blocchi call ed i blocchi procedure li trovate nella categoria Procedures, come mostra l'immagine seguente:
Struttura del blocco di procedura ago_verso_orario
Il blocco ago_verso_orario, viene eseguito ogni 300 millisecondi (tre volte al secondo), quando il valore della variabile flag è uguale a zero.
Il blocco esegue le seguenti operazioni:
1) Visualizza nella Lable "Lab_timer" il progressivo dell'immagine dell'ago corrente, che corrisponde al valore della variabile fotogramma;
2) Azzera il valore della variabile fotogramma, quando è uguale a 12;
3) Incrementa di 1 il valore della variabile fotogramma che serve per caricare l'immagine dell'ago successiva;
4) Se il valore della variabile fotogramma è minore di 10 il nome dell'immagine dell'ago da caricare viene composto nel modo seguente:
ago0 + fotogramma+.png
Altrimenti il nome dell'immagine dell'ago da caricare viene composto nel modo seguente:
ago + fotogramma+.png
5) Viene caricata l'immagine dell'ago all'interno dell ImagSprite "Ago_bussola".
L'immagine seguente mostra il blocco di procedura ago_verso_orario:
Struttura del blocco di procedura ago_verso_antiorario
Il blocco ago_verso_antiorario, viene eseguito ogni 300 millisecondi (tre volte al secondo), quando il valore della variabile flag è uguale a uno.
Il blocco esegue le seguenti operazioni:
1) Visualizza nella Lable "Lab_timer" il progressivo dell'immagine dell'ago corrente, che corrisponde al valore della variabile fotogramma;
2) Imposta il valore della variabile fotogramma a 13, quando è uguale a 1;
3) Decrementa di 1 il valore della variabile fotogramma che serve per caricare l'immagine dell'ago precedente;
4) Se il valore della variabile fotogramma è minore di 10 il nome dell'immagine dell'ago da caricare viene composto nel modo seguente:
ago0 + fotogramma+.png
Altrimenti il nome dell'immagine dell'ago da caricare viene composto nel modo seguente:
ago + fotogramma+.png
5) Viene caricata l'immagine dell'ago all'interno dell ImagSprite "Ago_bussola".
Come gestire il Blocco Timer utilizzando i pulsanti Start+, Start- e Stop
Per concludere l'APP Bussola_Automatica, esaminiamo i blocchi seguenti:
1) Initialize global fotogramma, crea la variabile fotogramma e la imposta ad uno, questa variabile serve per comporre il nome dell'immagine dell'ago da caricare;
2) Initialize global flag, crea la variabile flag e la imposta a zero, questa variabile viene usata nel blocco Timer per far girare l'ago in senso orario oppure in senso antiorario;
3) when Scree1.Initialize carica l'immagine ago01.png nell'ImageSprite "Ago_Bussola";
4) when But_Start_meno.Click, imposta il flag ad uno per far girare l'ago in senso antiorario. Il blocco set lo potete ottenere spostando il puntatore del mouse sul blocco Initialize global flag.
Successivamente viene impostata la proprietà del Timer TimerEnabled a True, che abilita il Clock ed esegue il blocco Timer ogni 300 millisecondi (3 volte al secondo), facendo girare automaticamente l'Ago in senso antiorario.
5) when But_Start_piu.Click, imposta il flag ad zero per far girare l'ago in senso orario. Il blocco set lo potete ottenere spostando il puntatore del mouse sul blocco Initialize global flag.
Successivamente viene impostata la proprietà del Timer TimerEnabled a True, che abilita il Clock ed esegue il blocco Timer ogni 300 millisecondi (3 volte al secondo), facendo girare automaticamente l'Ago in senso orario.
6) when But_Start_piu.Click impostata la proprietà del Timer TimerEnabled a False, che disabilita il Clock fermando la rotazione dell'Ago.
Per eseguire l'APP Bussola_Automatica, avviate l'emulatore aiStarter:
e avviate l'APP selezionando Connect e cliccando sul comando Emulator.
Se avete l'emulatore sul cellulare, per avviare l'APP dovete procedere come segue:
1) lanciare l'emulatore sul cellulare
2) selezionare Connect sul computer e cliccare sul comando AI Companion
3) Inserire oppure leggere con il QR code il codice visualizzato sul computer.
T U T O R I A L S S U G G E R I T I
Ricominciamo ... dal linguaggio SQL Lezione 13
Gino Visciano |
Skill Factory - 28/04/2016 22:28:39 | in Tutorials
Benvenuti alla tredicesima lezione, in questa nuova lezione utilizzerete gli operatori insiemistici per eseguire interrogazioni complesse con il comando Select.
Gli operatori insiemistici sono tre:
- UNION (Unoine)
- INTERSECT (Intersezione)
- EXCEPT (Differenza)
MySQL ha solo l'operatore UNION, per ottenere il risultato di INTERSECT ed EXCEPT dovete combinare gli operatori JOIN ed IN del comando Select con l'operatore UNION.
Per applicare praticamente gli operatori insiemistici, partiamo dalle tabelle seguenti:
CLIENTI
id | nominativo | piva | telefono | e_mail | localita | provincia |
1 | Morgan & C. | 01111111111 | 082770901 | info@morgan.com | Roma | RM |
2 | Fiorini & Figli | 02222222222 | 082770902 | info@fiorini.com | Napoli | NA |
3 | Aldebran | 03333333333 | 082770903 | info@aldebran.com | Milano | MI |
4 | Cassandra | 04444444444 | 082770904 | info@cassandra.com | Roma | RM |
5 | Pedretti | 05555555555 | 082770905 | info@pedretti.com | Napoli | NA |
6 | Staiano | 06666666666 | 082770906 | info@staiano.com | Milano | MI |
FORNITORI
id | nominativo | piva | telefono | e_mail | localita | provincia |
1 | Dedalo | 06666666666 | 081889801 | info@dedalo.com | Roma | RM |
2 | Alessandrini | 07777777777 | 081889802 | info@alessandrini.com | Roma | RM |
3 | Cozzolino | 08888888888 | 081889803 | info@cozzolino.com | Napoli | NA |
4 | Sastri | 09999999999 | 081889804 | info@sastri.com | Milano | MI |
5 | Aliblu | 01111111112 | 081889805 | info@aliblu.com | Palermo | PA |
6 | Aldebran | 03333333333 | 082770903 | info@aldebran.com | Milano | MI |
7 | Cassandra | 04444444444 | 082770904 | info@cassandra.com | Roma | RM |
8 | Pedretti | 05555555555 | 082770905 | info@pedretti.com | Napoli | NA |
La caratteristica delle due tabelle è quella che hanno dei record in comune (Aldebran, Cassandra e Pedretti), perché sono sia Clienti, sia Fornitori.
Operatore UNION
Questo operatore permette di unire il risultato di due Select eliminado i valori duplicati.
Ad esempio, immaginate di voler ottenere un Report con tutti i contatti telefonici ed e-mail dei vostri Clienti e Fornitori registrati nelle tabelle Clienti e Fornitori, con il comando seguente potete ottenere il risultato richiesto:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
UNION
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Aldebran | 082770903 | info@aldebran.com |
Alessandrini | 081889802 | info@alessandrini.com |
Aliblu | 081889805 | info@aliblu.com |
Cassandra | 082770904 | info@cassandra.com |
Cozzolino | 081889803 | info@cozzolino.com |
Dedalo | 081889801 | info@dedalo.com |
Fiorini & Figli | 082770902 | info@fiorini.com |
Morgan & C. | 082770901 | info@morgan.com |
Pedretti | 082770905 | info@pedretti.com |
Sastri | 081889804 | info@sastri.com |
Staiano | 082770906 | info@staiano.com |
Se un contatto è sia cliente, sia fornitore, verrà visualizzato una volta sola, perché l'operatore UNION non visualizza i record duplicati.
Per visualizzare anche i record duplicati dovete usare l'operatore UNION ALL, come mostra l'esempio seguente:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
UNION ALL
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Aldebran | 082770903 | info@aldebran.com |
Aldebran | 082770903 | info@aldebran.com |
Alessandrini | 081889802 | info@alessandrini.com |
Aliblu | 081889805 | info@aliblu.com |
Cassandra | 082770904 | info@cassandra.com |
Cassandra | 082770904 | info@cassandra.com |
Cozzolino | 081889803 | info@cozzolino.com |
Dedalo | 081889801 | info@dedalo.com |
Fiorini & Figli | 082770902 | info@fiorini.com |
Morgan & C. | 082770901 | info@morgan.com |
Pedretti | 082770905 | info@pedretti.com |
Pedretti | 082770905 | info@pedretti.com |
Sastri | 081889804 | info@sastri.com |
Staiano | 082770906 | info@staiano.com |
Operatore INTERSECT
Questo operatore permette di confrontare il contenuto di due tabelle e visualizza solo i valori uguali.
Ad esempio, per visualizzare il numero di telefono e l'indirizzo e-mail dei contatti che sono sia clienti, sia fornitori, dovete usare il comando seguente:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
INTERSECT
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Aldebran | 082770903 | info@aldebran.com |
Cassandra | 082770904 | info@cassandra.com |
Pedretti | 082770905 | info@pedretti.com |
In MySQL l'operatore INTERSECT non esiste, lo dovete sostituire con il JOIN seguente:
select c.nominativo as "CONTATTO", c.telefono as "TELEFONO", c.e_mail as "E-MAIL" from clienti as c join fornitori as f on(c.nominativo=f.nominativo and c.telefono=f.telefono and c.e_mail=f.e_mail) order by c.nominativo;
Operatore EXCEPT
Questo operatore permette di confrontare il contenuto di due tabelle e visualizza solo i valori diversi.
Ad esempio, per visualizzare il numero di telefono e l'indirizzo e-mail dei contatti che sono clienti oppure fornitori, escludendo tutti quelli che sono sia clienti, sia fornitori, dovete usare il comando seguente:
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from clienti
EXCEPT
select nominativo as "CONTATTO", telefono as "TELEFONO", e_mail as "E-MAIL" from fornitori order by CONTATTO;
CONTATTO | TELEFONO | |
Alessandrini | 081889802 | info@alessandrini.com |
Aliblu | 081889805 | info@aliblu.com |
Cozzolino | 081889803 | info@cozzolino.com |
Dedalo | 081889801 | info@dedalo.com |
Fiorini & Figli | 082770902 | info@fiorini.com |
Morgan & C. | 082770901 | info@morgan.com |
Sastri | 081889804 | info@sastri.com |
Staiano | 082770906 | info@staiano.com |
In MySQL l'operatore EXCEPT non esiste, lo dovete sostituire con il comando seguente:
select c.nominativo as "CONTATTO", c.telefono as "TELEFONO", c.e_mail as "E-MAIL" from clienti c where not (c.nominativo in (select nominativo from fornitori) and c.telefono in (select telefono from fornitori) and c.e_mail in (select e_mail from fornitori))
UNION
select f.nominativo as "CONTATTO", f.telefono as "TELEFONO", f.e_mail as "E-MAIL" from fornitori f where not (f.nominativo in (select nominativo from clienti) and f.telefono in (select telefono from clienti) and f.e_mail in (select e_mail from clienti)) order by CONTATTO;
La prima Select visualizza solo i clienti con il nominativo, il telefono e l'e-mail diversi da tutti i fornitori. L'operatore IN esegue le Query nidificate e con il risultato ottenuto, crea un elenco di valori che vengono confrontati con il valore delle colonne indicate. Ad esempio c.nominativo in (select nominativo from fornitori) confronta il nominativo del cliente corrente, con tutti i nominativi dei fornitori.
La seconda Select visualizza solo i fornitori con il nominativo, il telefono e l'e-mail diversi da tutti i clienti.
L'Unione delle due Select fornisce il risultato richiesto.
T U T O R I A L S S U G G E R I T I