MySQL distribuito gratuitamente per Linux sul sito http://www.mysql.com. Di solito l'ultima
versione stabile viene identificata come "recommended". Vedremo come installare MySQL
partendo dai file mysql-xxx.tar.gz (dove xxx sta per il numero della versione), sappiate
comunque che esistono anche versioni in RPM o DEB.
Accertatevi di essere entrati nel sistema come root, altrimenti usate il comando su root.
Per cominciare scompattate il file e spostatevi nella directory appena creata.
tar xzf mysql-xxx.tar.gz
cd mysql-xxx
Adesso il momento di configurare il programma che curer l'installazione di MySQL nel sistema.
Se non conoscete bene le opzioni il consiglio quello di limitarsi a specificare il percorso di
installazione: le altre impostazioni di default vanno bene nella maggioranza dei casi. Solitamente il
percorso consigliato /usr/local/mysql, ma naturalmente potete scegliere il percorso che vi sembra
pi comodo.
./configure --prefix=/usr/local/mysql
Adesso vedrete molte schermate di configurazione, teneto sott'occhio il README e fate attenzione
alle opzioni proposte. Finita questa parte siete pronti per lanciare la compilazione vera e propria:
make
A questo punto potete tranquillamente cancellare la directory nella quale vi trovate. Essa infatti
contiene solamente file di installazione e temporanei; nel caso dobbiate reinstallare il programma
dovrete solamente scompattare nuovamente mysql-xxx.tar.gz.
Avviamo il server:
mysqld
Adesso potete vedere il paragrafo sulla configurazione di MySQL per iniziare a lavorare con il
database.
effettuare delle operazioni su di esso sar vincolata al fatto di avere un nome utente e una password
di accesso.
Iniziamo assegnando una password all'utente "root". La password va inserita tra virgolette, come
nell'esempio.
mysqladmin -u root password "mia_password"
Per assicurarci che MySQL abbia registrato il cambiamento, ricarichiamo le tabelle di accesso:
mysqladmin -u root reload
Se appare un messaggio d'errore, va tutto bene :)) Questo infatti significa che d'ora in poi dovrete
inserire la password per operare sul server.
Proviamo ora a vedere se la password viene riconosciuta, ad esempio esaminando i parametri di
lavoro del server:
mysqladmin -u root -p status
Appena premuto invio vi verr richiesta la password. Mentre la scriverete non apparir nulla; non
preoccupatevi, una misura di sicurezza per evitare che qualche curioso, sbirciando, riesca a vedere
quanto lunga la password.
-u root indica a MySQL che volete accedere con il nome utente "root"; -p indica che vi dovr
essere richiesta la password per eseguire l'operazione. Come abbiamo visto omettendo -p il server
si rifiuta di compiere l'operazione.
Adesso dovrete inserire la password anche per fermare il server:
mysqladmin -u root -p shutdown
Memoria
occupata
Se solo positivi
(UNSIGNED)
TINYINT
1 byte
da -128 a +127
da 0 a +255
SMALLINT
2 byte
da -32768 a +32767
da 0 a +65535
MEDIUMINT
3 byte
da -8388608 a +8388607
da 0 a +16777215
INT
4 byte
da -2147483648 a +2147483647
da 0 a +4294967295
BIGINT
8 byte
da -9223372036854775808 a
+9223372036854775807
da 0 a
+18446744073709550615
FLOAT(I,D)
4 byte
DOUBLE(I,D)
8 byte
2 Byte
I e D rappresentano i numeri Interi e Decimali ammessi.
TINYTEXT
255 byte
TINYBLOB
255 byte
TEXT
65535 byte
BLOB
65535 byte
MEDIUMTEXT 1,6 MB
MEDIUMBLOB 1,6 MB
LONTEXT
4,2 GB
LONGBLOB
4,2 GB
CHAR e VARCHAR
Questi due tipi di campi, nonostante la somiglianza nel nome, si comportano in maniera molto
diversa. Il primo ha una lunghezza fissa, mentre il secondo variabile.
Ci significa che se creassimo un campo CHAR(9) e al suo interno specificassimo "ciao", questo
campo occuperebbe comunque 9 byte invece di 4. Con VARCHAR(9) invece, scrivendo al suo
interno "ciao" il campo occuperebbe 5 byte (guardare la tabella superiore X+1 dove in questo caso
X=4, quindi 4+1=5).
All'interno di una tabella, non possibile utilizzarli entrambi. Creando ad esempio due campi nella
stessa tabella, uno CHAR e l'altro VARCHAR, MySQL render entrambi VARCHAR, come
possibile vedere dall'immagine seguente, realizzata con PhpMyAdmin.
TEXT e BLOB
TEXT e BLOB sono i campi di MySQL dedicati a contenere grandi quantit di dati. Fino a 4,2 GB
con i LONGTEXT e LONGBLOB.
Il secondo in particolare, il campo di tipo BLOB sta per Bynary Large Object e consente il
salvataggio di interi file nel formato binario. Utile per nascondere file dietro username e password,
senza cos riuscire a rintracciare il percorso fisico del file (che infatti non esiste, essendo incluso
direttamente nel database).
I modificatori
I modificatori previsti da questi tipi di campi sono:
BINARY:
ammesso dai campi CHAR e VARCHAR: i dati salvati saranno trattati come stringhe
binarie.
DEFAULT:
ammesso da tutti i tipi di campi: imposta un valore predefinito nel caso il campo fosse
lasciato vuoto.
NOT NULL:
ammesso da tutti i tipi di campi: impone che il campo non sia lasciato vuoto.
NULL:
ammesso da tutti i tipi di campi: se il campo non contiene un valore, sar vuoto.
PRIMARY KEY:
ammesso da tutti i campi, ma consigliabile impostarlo su dati di tipo numerico. Serve a
impostare un indice i quali dati non devono essere vuoti.
Gli altri modificatori: UNIQUE, UNSIGNED e ZEROFILL sono stati trattati nella puntata dedicata
ai tipi di dati numerici.
DATETIME
E' il formato pi completo e preciso a nostra disposizione. Varia da 1000-01-01 00:00:00 a 999912-31 23:59:59
DATE
Uguale al precedente, ma senza l'ora. Ammette infatti dati a partire da 1000-01-01 al 9999-12-31.
TIME
Salva l'ora. I valori vanno da 00:00:00 a 23:59:59. E' possibile per salvare intervalli di valore tra
un evento e un altro e qundi, ammettere ore differenti. In questo caso, i dati vanno da -838:59:59 a
838:59:59.
MySQL legge i valori partendo da destra, quindi, salvando un campo con il contenuto 8:32, nel
database verr interpretato come 00:08:32.
Oltre ai due punti ( : ) MySQL ammette altri segni di interpunzione senza particolari difficolt.
L'immissione di un valore sbagliato sar salvato come mezzanotte in punto (00:00:00).
YEAR
Salva l'anno ed il campo pi leggero: 1 solo byte. Ammette valori dal 1901 al 2155. Gli anni
possono essere salvati a due o a quattro cifre. MySQL, in caso di anni a due cifre, interpreter i
valori da 70 a 99 come dal 1970 al 1999. Quelli dall'1 al 69, come dal 2001 al 2069.
Per evitare fraintendimenti quindi, consigliabile impostare l'anno a quattro cifre.
TIMESTAMP
Questo campo salva (nel formato scelto dal numero tra le parentesi, si veda la tabella superiore) il
momento esatto in cui la tabella viene modificata. Quindi pu essere utile per visualizzare (senza
doverlo calcolare ogni volta) il momento dell'ultima modifica del record in cui il campo
TIMESTAMP appartiene.
Ammette anni compresi tra il 1970 e il 2037.
Tutti i tipi di TIMESTAMP occupano lo stesso spazio: 4 byte. Perch questo? Nonostante i vari
formati? Perch MySQL salva comunque tutti i dati e poi ne visualizza solo quelli richiesti. Ad
esempio, con TIMESTAMP(2) il database visualizza solo due cifre dell'anno, ma in memoria ha
tutti gli altri dati (anno a 4 cifre, mese, giorno, ora, minuti e secondi). Quando infatti modifichiamo
il tipo di TIMESTAMP, ad esempio con TIMESTAMP(8) lui ha tutti i dati in memoria.
La stessa cosa avviene quando abbassiamo il valore di TIMESTAMP, visualizzando quindi meno
dati. MySQL non canceller i vari valori, semplicemente li nasconder
ENUM
Indica a MySQL le varie possibilit previste. Ad esempio, con:
ENUM('mare','montagna','lago')
Si impone l'utente la scelta di uno di queste tre possibilit. Altri valori, saranno trattati come valori
vuoti (NULL), a meno che non sia definito un valore di default.
Si possono inserire fino a 65.535 voci.
Tornando all'esempio precedente: ENUM('mare','montagna','lago') a questo tipo di campo (che
chiameremo "scelta_vacanze") possibile selezionare una voce come se ci si trovasse di fronte a un
array (che parte da 1 come in VB e derivati - tipo VBScript).
Ad esempio, con:
SELECT scelta_vacanze FROM nomeTabella WHERE scelta_vacanze = 2
SET
Questo tipo di dato uguale a ENUM, con la differenza di poter effettuare una scelta multipla. Il
campo ENUM infatti, consente di scegliere un solo valore alla volta.
Introduzione a PhpMyAdmin
PhpMyAdmin un'interfaccia grafica sviluppata in Php in grado di interagire con database MySQL
senza la necessit di scrivere alcuna riga di codice SQL. Tutti gli RDBMS infatti sono interrogabili
grazie a tools di amministrazione (come ad esempio "SQL Server Enterprise Manager" per
Microsoft SQL Server, "Toad" per Oracle e "pgAdmin3" per PostgreSQL) oppure da complesse
linee di codice SQL (Structured Query Language).
Il progetto PhpMyAdmin raggiungibile all'indirizzo http://www.phpmyadmin.net e rilasciato
sotto licenza GNU, ovvero distribuibile gratuitamente con i relativi codici sorgenti. Disponibile in
oltre 40 lingue differenti, compreso l'italiano, offre tutto ci che un ottimo SQL developer avrebbe
bisogno:
a) creare o cancellare database
b) creare, copiare, cancellare, rinominare e modificare tabelle
c) occuparsi della manutenzione delle tabelle
d) rimuovere, modificare ed aggiungere campi
e) eseguire qualsiasi istruzione SQL, anche queries in modalit batch
f) gestire le chiavi (key) nei campi
g) caricare file di testo all'interno delle tabelle
h) creare e leggere dump (backup su file) di tabelle
i) esportare dati in formato CSV, XML e Latex
l) amministrare server multipli
m) gestire utenti e privilegi MySQL
n)verificare l'integrit referenziale delle tabelle in MyISAM
o) usare la modalit Query-by-example (QBE), per la creazione automatica di complesse queries
collegando le tabelle richieste
p) creare PDF grafici del layout del Database
q) eseguire ricerche globali all'interno del database o in un sottoinsieme di quest'ultimo
Installazione e configurazione
Per prima cosa occorre scaricare l'ultima versione stabile del programma all'indirizzo
www.phpmyadmin.net/home_page/downloads.php
A) Decomprimere (untar o unzip) la distribuzione nella directory root del server Web (o del
localhost). Se non si avesse l'accesso diretto alla cartella root, consigliabile inserire i file in una
directory sulla macchina locale, e, una volta configurato il tutto, trasferire la cartella sul server Web
utilizzando, ad esempio, il protocollo FTP. Con sistemi Windows e Mac il pacchetto si estrarr
avvalendosi di programmi tipo WinZip e ZipIt, con Linux digitando le seguenti stringhe:
$ cd /usr/local/apache/htdocs/
$ tar -xzvf /tmp/phpMyAdmin-2.5.3.tar.gz
La decompressione creer una cartella denominata PhpMyAdmin
B) Aprire il file config.inc.php con l'editor preferito e cambiare i valori relativi all'host, all'utente,
alla password ed alla modalit di autenticazione a seconda del proprio ambiente di lavoro. Ad
esempio, "host" identifica il server dove si trova MySQL. Inserire inoltre il valore corretto per
l'$cfg['PmaAbsoluteUri']. Ad esempio:
$cfg['PmaAbsoluteUri'] = 'http://localhost/phpMyAdmin/';
C) Si raccomanda di proteggere la directory in cui installato phpMyAdmin (a meno che non si
tratti di una intranet o che si preferisca un metodo di autenticazione basato su HTTP o cookie) ad
esempio con HTTP-AUTH (all'interno del file .htaccess)
D) Maggiori informazioni e dettagli tecnici nella
www.phpmyadmin.net/pma_localized_docs/Documentation-it.html#config
Stesso discorso vale per la cancellazione, nella pagina "SQL", vi dovrebbe essere un link
denominato "Elimina database".
In fondo alla pagina apparir il form per scegliere il nome della nuova tabella e il numero di campi
da inserire:
Scelto il nome ed il numero di campi, apparir una pagina dove scegliere il nome dei campi.
Tralasciando gli aspetti tecnici legati al tipo di campo (argomento trattato nelle puntate precedenti
su MySQL) , per questa recensione sufficiente nominare i campi ad esempio: pippo1, pippo2,
pippo3 ed impostare la dimensione del campo (ad esempio 10).
La prima pagina, appena scelta la tabella, denominata "Struttura", dove abbiamo appena descritto
l'utilit: visualizza i campi e ne descrive le peculiarit.
Con la voce "Mostra" si ha la possibilit di visualizzare il contenuto dei campi, di default
impostato a 30 record per pagina.
Con la voce "SQL" l'utente ha la facolt di eseguire operazione direttamente con sintassi SQL.
Con la voce "Cerca" si possono trovare i dati nei record tramite un potente strumento di ricerca
avanzata.
Con la voce "Inserisci" si potr inserire una nuova riga nella tabella.
Tramite la voce "Esporta" tutti i campi o a seconda della volont dell'utente, parzialmente,
potranno essere esportati in diversi formati: SQL, LaTex, CSV per Excel, CSV, Xml.
Con la voce "Operazioni", tutte le propriet della tabella saranno modificabili, dal nome alla sua
ottimizzazione e/o copiatura.
Grazie al campo "Svuota" tutti i dati presenti nella tabella verrano eliminati, mantenendo per la
struttura della tabella e soprattutto se si avessero dati autocrementali il primo record ripartirebbe da
1.
Con la voce "Elimina", naturalmente si cancella la tabella intera, quindi sia i dati in essa presente,
sia la struttura. Per sicurezza, PhpMyAdmin chiede la conferma se per errore si dovesse cliccare la
voce
Risorse.net
Per modificare o cancellare un campo sufficiente posizionarsi sulle icone presenti nella "Struttura"
tabella. Di seguito l'immagine che chiarisce il tutto:
Risorse.net
Per effettuare una copia di sicurezza (detto anche dump) del proprio database MySQL, occorre
selezionare dal menu a destra la voce Home e dal frame a destra selezionare la voce "Esporta",
come raffigurato dall'immagine sottostante:
SQL di base
SQL, acronimo di Structured Query Language, un linguaggio utilizzato per manipolare database.
MySQL sfrutta proprio SQL per interagire con gli utenti, attraverso dei comandi comunemente
chiamati query.
Una query permette di "parlare" al database e consente di effettuare operazioni sul suo contenuto o
sulla sua struttura.
Per selezionare i campi di un database, si usa il termine SELECT. Ammettiamo di dover estrarre il
contenuto da tutti i campi di una tabella di nome "clienti", faremo:
SELECT * FROM clienti;
L'asterisco ( * ) ci consente di richiamare i campi senza specificare tutti i loro nomi. Il termine
FROM permette di identificare il nome della tabella dalla quale estrapolare i dati. Se volessimo
invece estrarre un solo campo, inutile estrarli tutti e potremmo quindi usare il nome specifico, ad
esempio:
SELECT ordini FROM clienti;
Se i campi fossero pi di uno, necessario separare i vari valori con una virgola ( , ) ad esempio:
SELECT ordini, citta, fatture FROM clienti;
Pi in profondit: AND e OR
Facendo riferimento all'esempio di prima, potremmo richiedere i nomi dei clienti che hanno sede a
Milano e hanno effettuato pi di 10 ordini. Ecco come:
SELECT nome FROM clienti WHERE citta = 'milano' AND ordini <= 10;
Con la query sopra specificata, avremo sottomano i clienti di Milano con un numero di ordini
maggiore o uguale a 10. Il termine AND pu essere tranquillamente sostituito da due e commerciali
( && ).
Il termine OR, permette di creare un'alternativa. Ad esempio, se volessimo estrarre i clienti con sede
a Milano oppure a Napoli, faremo:
SELECT nome FROM clienti WHERE citta = 'milano' OR citta = 'napoli';
Il termine OR pu essere sostituito dalle due barre verticali ( || ).
ORDER BY multipli
Si possono ordinare i campi anche in base a pi valori. Ammettiamo di volere i risultati delle query
precedenti, dai clienti che hanno fatto pi ordini a quelli che ne hanno fatti meno, in ordine
alfabetico.
SELECT * FROM clienti ORDER BY nome, ordini DESC;
In questo modo, avremo le societ in ordine alfabetico e da chi ha fatto pi ordini a chi ne ha fatti di
meno.
Operatori di confronto
Quando si eseguono query SQL, importante sapere quali operatori possono essere usati per
confrontare un campo con un altro, oppure con un valore da noi specificato.
I pi usati sono:
<
>
<=
>=
=
!=
LIKE
I primi cinque operatori, sono uguali a tutti gli altri linguaggi di scripting o di programmazione e
identificano:
Minore
Maggiore
Minore o uguale
Maggiore o uguale
Uguale
Diverso
Un approfondimento a parte merita LIKE, che consente di effettuare una comparazione tra campi
simili, anche non uguali.
Ad esempio, ammettiamo di voler estrarre, dalla tabella clienti, quelle aziende che contengano nella
descrizione della societ la parola Internet. Ecco come fare:
SELECT nome FROM clienti WHERE descrizione LIKE '%internet%'
I due simboli di percentuale ( % ), servono a MySQL per sapere che prima e dopo il termine
internet, potrebbero esserci altre parole. Se non avessimo usato questa query, magari usando
WHERE descrizione = 'internet', il database avrebbe cercato quelle aziende che contengano nel
campo descrizione la sola parola internet.
Possiamo anche usare le % in maniera diversa. Ad esempio:
SELECT nome FROM clienti WHERE citta LIKE 'mila%'
In questo modo, MySQL estrarr tutte quei clienti che hanno come sede la parola mila seguita da
altro testo, ad esempio: Milano, Milazzo, Milano Marittima ecc.
Operatori matematici
Con MySQL possibile eseguire delle query utilizzando all'interno della sintassi SQL degli
operatori matematici, che sono i classici della somma, sottrazione, moltiplicazione e divisione.
Somma
Possiamo sommare due o pi campi per ottenere un nuovo campo, ad esempio:
SELECT (primoCampo + secondoCampo) AS totale FROM nomeTabella;
In questo modo, avremo una colonna di nome "totale" in cui saranno contenute tutte le somme dei
due campi.
Differenza
Come per la somma, possiamo fare:
SELECT (primoCampo - secondoCampo) AS differenza FROM nomeTabella;
Moltiplicazione
All'interno delle query possibile anche moltiplicare i valori di pi campi, ad esempio:
SELECT (primoCampo * secondoCampo) AS risultato FROM nomeTabella;
Divisione
E ancora, per la divisione, possiamo usare:
SELECT (primoCampo / secondoCampo) AS risultato FROM nomeTabella;
Elevazione a potenza
L'elevazione a potenza con MySQL si pu ottenere usando due funzioni: POW(x,y) o
POWER(x,y), dove x rappresenta la base della potenza e y l'esponente. Ecco un esempio:
SELECT POW(10,3);
Restituisce: 1000.000000
Radice quadrata
La radice quadrata non negativa di un numero si ottiene con:
SELECT SQRT(9);
E restituisce: 3.000000
Casi pratici
Gli operatori matematici possono essere molto comodi anche per ordinare dei risultati. Ammettiamo
di avere una tabella che contenga i voti totali assegnati a un articolo e il numero di persone che
hanno votato. Per ordinare i records cos da ottenere gli articoli pi apprezzati, faremo:
SELECT id,titolo FROM articoli ORDER BY (voti_totali / numero_voti) DESC;
Per migliorare la query e avere sottomano anche la media dei voti di ogni articolo, possiamo crearci
un campo provvisorio con il comando AS, ecco come:
SELECT (voti_totali / numero_voti) AS mediaVoto, id, titolo FROM articoli ORDER BY
mediaVoto DESC.
In questa puntata vedremo gli operatori pi avanzati, che consentono i calcoli di logaritmi, seni e
coseni, tangenti, archi e arrotondamenti.
LEAST
La funzione LEAST restituisce la cifra pi piccola di quelle passate come parametri. Ad esempio:
SELECT LEAST(1, 4, 5, 8.6, 0.9);
Restituisce: 0.9
GREATEST
Funzione simile alla precedente, ma ricava il numero pi grande. Tipo:
SELECT GREATEST(1, 4, 5, 8.6, 0.9);
Restituisce: 8.6
MOD
Questa funzione da' come risultato il resto di un numero (passato come primo parametro) diviso per
l'altro numero (passato come secondo parametro). Vediamo:
SELECT MOD(5,2);
Restituisce 1
FLOOR
La funzione FLOOR arrotonda la cifra specificata all'intero pi grande inferiore alla cifra stessa.
Ecco un esempio chiarificatore:
SELECT FLOOR(11.5);
Restituisce: 11
CEILING
Questa funzione molto simile alla FLOOR ma esegue l'arrotondamento al valore minore non
inferiore alla cifra stessa. Ecco il solito esempio "schiarsci-idee":
SELECT CEILING(11.5);
Restituisce: 12
ROUND
A questa funzione vengono passati due parametri: nel primo il numero da arrotondare e nel secondo
parametro, a quale cifra decimale effettuare l'arrotondamento.
Ecco come:
SELECT ROUND(12.5682,2);
Restituisce: 12.57
Se il secondo parametro non venisse specificato, la cifra viene arrotondata all'intero pi grande
EXP
La funzione EXP restituisce la base dei logaritmi naturali elevata alla potenza della cifra indicata.
Ecco come:
SELECT EXP(2);
Restituisce: 7.389056
LOG
Questa funzione da' come risultato il logaritmo naturale del numero indicato. Ecco:
SELECT LOG(12);
Restituisce: 2.484907
LOG10
Questa funzione, simile alla precedente, restituisce il logaritmo del numero specificato in base 10.
SELECT LOG10(12);
Restituisce: 1.079181
SIGN
La funzione SIGN consente di ottenere tre risultati diversi in base al segno della cifra indicata. Un
numero positivo restituirebbe 1, un numero negativo -1 e un numero nullo (0 - zero) restituirebbe
per l'appunto 0. Vediamo tre esempi:
SELECT SIGN(5);
Restituisce: 1
SELECT SIGN(-2);
Restituisce: -1
SELECT SIGN(0);
Restituisce: 0
SIN
La funzione SIN ottiene il seno di una cifra data in radianti:
SELECT SIN(10);
Restituisce: -0.544021
COS
Questa funzione calcola il coseno di un numero dato in radianti:
SELECT COS(10);
Restituisce: -0.839072
TAN
La funzione TAN calcola la tangente di un numero espresso in radianti:
SELECT TAN(10);
Restituisce: 0.648361
ASIN
Questa funzione calcola l'arco seno di un numero. Restituisce NULL se la cifra non fosse compresa
tra -1 e 1.
SELECT ASIN(-0.5);
Restituisce: -0.523599
ACOS
Simile alla precedente, ma restituisce ovviamente l'arco coseno della cifra indicata quando
quest'ultima fosse compresa tra -1 e 1. Altrimenti restituirebbe NULL.
SELECT ACOS(-0.5);
Restituisce: 2.094395
ATAN
Questa restituisce invece l'arco tangente della cifra indicata:
SELECT ATAN(3);
Restituisce: 1.249046
ATAN2
Questa restituisce invece l'arco tangente delle due cifre indicate, tipo:
SELECT ATAN2(3,4);
Restituisce: 0.643501
COT
La funzione COT restituisce la cotagente della cifra data, ad esempio:
SELECT COT(5);
Restituisce: -0.29581292
DEGREES
Questa funzione converte i numeri da radianti a gradi:
SELECT DEGREES(2);
Restituisce: 114.59155902616
RADIANS
Effettua l'operazione inversa della funzione precedente. Ovvero partendo da un numero in gradi, lo
converte in radianti.
SELECT RADIANS(114.59155902616);
Restituisce: 1.9999999999999
Funzioni condizionali
Le funzioni condizionali di MySQL consentono di eseguire query verificando che un'istruzione sia
vera o falsa.
Come per tutti i linguaggi di programmazione, la condizione e il relativo comportamente viene
suddiviso su tre passaggi:
1. La condizione
2. Se la condizione vera, esegue questa istruzione
3. Se la condizione falsa, esegue un'altra istruzione
Il classico If ... Then ... Else ...
MySQL prevede diverse sintassi per le verifiche condizionali. Vediamone alcune:
La funzione IF
La funzione IF permette di confrontare dei campi e restituire delle istruzioni diversi a seconda della
veridicit della condizione iniziale:
SELECT IF(primoCampo != secondoCampo, 1, 0) FROM nomeTabella;
Con questo tipo di query, MySQL confronta il primoCampo con il secondoCampo. Se fossero
diversi, restituirebbe 1, altrimenti 0.
Vediamo un caso banale ma pratico. Possiamo effettuare la verifica condizionale IF anche con dei
numeri. Ad esempio:
SELECT IF(1<2, 'vero', 'falso');
In questo caso, MySQL restituisce "vero", perch 1 minore di 2.
IFNULL
Questa funzione pu risultare molto comoda per intercettare i NULL che MySQL potrebbe
restituire. IFNULL infatti intercetta i casi di NULL e restituisce ci che il database administrator
desidera.
Pu essere utile quando si divide un campo per un altro quando non si sa cosa contengano i due
campi (magari perch dinamicamente modificati dagli utenti). Se infatti il secondo campo fosse
zero ( 0 ), dividere per 0 restituisce un errore, per MySQL quindi NULL. Onde evitare questo
problema, si usa il condizionale IFNULL. Vediamo un esempio con dei numeri:
SELECT IFNULL(2/0,'impossibile');
In questo caso MySQL, invece di restituire NULL, restituisce "impossibile".
CASE
Questo condizionale consente a MySQL di verificare pi campi, come per il Select Case di Visual
Basic o Switch() per i linguaggi derivati da C (Java, Javascript, C# ecc.).
Quindi, invece di avere una sola condizione, CASE consente di effettuare pi verifiche, ad esempio:
SELECT CASE 1 WHEN primoCampo = 'primoValore' THEN 1 WHEN secondoCampo =
'secondoValore' THEN 2 WHEN terzoCampo = 'terzoValore' THEN 3 ELSE 'nessuna condizione
vera' END;
In questo modo, se uno dei valori del campo primoCampo uguale a "primoValore", allora MySQL
restituisce 1. E cos via per il secondoCampo e il terzoCampo. Se nessuna condizione soddisfatta,
MySQL restituisce "nessuna condizione vera". Il comando END finale, chiude il CASE.
Funzioni aggregate
Le funzioni aggregate servono per eseguire operazioni matematiche su una o pi colonne di
MySQL.
COUNT
La funzione COUNT viene utilizzata per recuperare il numero di righe di una colonna. Ad esempio:
SELECT COUNT(*) AS totale FROM nomeTabella;
Questa funzione pu essere utilizzata su qualunque tipo di dato.
COUNT(DISTINCT)
Questa funzione restituisce il numero delle diverse combinazioni che non contengono il valore
NULL.
Ad esempio, se in una colonna abbiamo 10 righe: 5 contenenti la parola "calcio", 3 contenenti il
termine "tennis" e le ultime 2 con "golf", effettuando un COUNT(DISTINCT) avremo il numero di
combinazioni diverse, ovvero 3 (calcio, tennis, golf).
SELECT(DISTINCT nomeCampo) FROM nomeTabella;
Per riassumere quindi, se avessimo una tabella di MySQL che raccoglie le registrazioni a un
determinato sito, SELECT COUNT(DISTINCT) pu essere utile per sapere quanti nomi diversi
sono stati usati, oppure quanti diversi titoli di studio ecc.
MAX
Questa funzione restituisce il valore pi alto contenuto all'interno di una colonna. Per i campi
numerici, restituisce il numero pi alto, per quelli testuali (nei nuovi MySQL questa operazione
permessa) seleziona il campo che secondo l'ordine alfabetico pi avanti (ad esempio due valori:
Alessandro e Filippo prende Filippo)
SELECT MAX(nomeCampo) FROM nomeTabella;
MIN
Questa funzione fa esattamente l'opposto della precedente: prende il valore pi basso. Ecco un
esempio:
SELECT MIN(nomeCampo) FROM nomeTabella;
AVG
Restituisce una media dei valori presenti in un campo. Da applicare ai soli campi numerici:
SELECT AVG(nomeCampoNumerico) FROM nomeTabella;
SUM
La funzione SUM somma i valori contenuti nel campo:
SELECT SUM(nomeCampoNumerico) FROM nomeTabella;
Anche questa funzione, va applicata ai soli campi numerici.
STD
Questa una funzione utile per gli statistici. Calcola infatti la distanza di un valore dalla media, e si
ottiene con:
SELECT STD(nomeCampoNumerico) FROM nomeTabella;
GROUP BY
La clausola GROUP BY consente di raggruppare un set di risultati in presenza di una delle funzioni
aggregate previste da MySQL.
Ammettiamo di avere una tabella con tre voci:
id (INT e AUTO_INCREMENT)
ordini (TINYINT)
cliente (VARCHAR)
Per sapere quale sia la distanza dalla media degli ordini di ogni cliente, faremo:
SELECT STD(ordini) AS dispersione, cliente FROM nomeTabella GROUP BY cliente;
In questo modo avremo due tabelle, "dispersione" che contiene la distanza della media degli ordini
e "cliente" contenente appunto il nome del cliente.
Caratteri alfanumerici
Per inserire spazi tra le parole, usare il simbolo underscore ( _ )
E nient'altro. E' bene quindi evitare altri simboli ( ? , . ` ' " @ + * ecc.), utilizzare il
carattere di spaziatura o anche il semplice trattino ( - ).
Questo ultimo simbolo, merita un approfondimento a parte. Se ci trovassimo di fronte a un campo
dal nome:
voti-totali
Per estrarlo, magari dalla tabella "voti", dovremmo fare:
SELECT `voti-totali` FROM voti
Questo perch la presenza del trattino ( - ) ci impone l'utilizzo del simbolo ` per raggruppare il
nome del campo (o della tabella).
mysql_escape_string()
Aggiunge le sequenze di escape in una stringa (implementata dalla versione 4.0.3 di PHP).
mysql_real_escape_string()
Aggiunge le sequenze di escape ai caratteri speciali in una stringa per l'uso in una istruzione
SQL, tenendo conto dell'attuale set di caratteri della connessione (presente dalla versione
4.3.0 di PHP).
PHP comunque, ha molte altre funzioni dedicate a MySQL, disponibili nella documentazione
ufficiale.
ASP
Le ASP non prevedono funzioni gi realizzate ma sarebbe utile farsene una.
Ad esempio qualcosa tipo:
Function PerSQL(info)
PerSQL = Replace(Replace(info,"\","\\"),"'","\'")
End Function
In questo modo, estrarremo un solo record a caso. Per cambiare, sufficiente modificare LIMIT 1
con i record che si vogliono estrarre (ad esempio LIMIT 3 ne estrae tre, oppure LIMIT 5,6 ne estrae
sei partendo dal quinto).
Modificare pi righe
La modifica di pi righe molto simile alla procedura seguita per la modifica di una sola riga,
sufficiente solo allargare le coincidenze della clausola WHERE. Ad esempio, per modificare tutti i
records che hanno il cmapo "id" maggiore a 10, faremo:
UPDATE nomeTabella SET nomeCampo = 'nuovoValore' WHERE id > 10;
Ci sono casi in cui necessario modificare pi righe che hanno "id" non raggruppabili. Sar
necessario specificare una nuova istruzione UPDATE, ad esempio:
UPDATE nomeTabella SET nomeCampo = 'nuovoValore' WHERE id = 5;
UPDATE nomeTabella SET nomeCampo = 'altroValore' WHERE id = 12;
UPDATE nomeTabella SET nomeCampo = 'ennesimoValore' WHERE id = 25;
direttamente a MySQL.
Cos mi sono messo a cercare in Rete un software creato apposta e ho trovato un ottimo prodotto, il
cui nome tutto un programma: Access to MySQL, disponibile all'indirizzo www.convertin.com/acc2sql.htm.
Il convertitore lavora bene anche con diverse versioni di MySQL e supporta due diverse opzioni: la
connessione diretta a MySQL e la creazione di un file cosidetto di DUMP, il quale consente di
ricreare la struttura delle tabelle e il loro contenuto in pochi minuti.
I file di DUMP, non sono altro che la lista dei comandi SQL (CREATE, INSERT ecc.) per la
creazione delle tabelle con la stessa struttura presente in Access. Si occupa anche di popolare le
tabelle con i records trovati. Il file di DUMP poi, possibile riutilizzarlo in qualunque software per
gestire MySQL da remoto, anche PhpMyAdmin.
Nel mio caso specifico, ho usato la versione demo di Access to MySQL, la quale consente di
ricreare la struttura delle tabelle e inserire fino a 5 records. E per gli altri? Mi sono creato un file in
locale che leggesse i rimanenti records e mi creasse un mio personale file di DUMP con le
istruzioni per inserire ci che la versione demo del software non faceva. Vediamo come.
Innanzitutto ho lanciato il software Access to MySQL e ho lasciato che lavorasse per me. Ho scelto
prima la creazione del file di DUMP:
Poi ho scelto le opzioni offerte dal software: il database MySQL usato (nel mio caso 3.23.6 o
superiori e MS Windows).
Come si pu vedere dall'immagine successiva, si pu scegliere tra MySQL nelle versioni inferiori o
superiori alla 3.23.6 e se il database risiede su una macchina dotata di un sistema operativo
Windows o Unix (\r\n e \n sono le due istruzioni per intercettare una nuova riga, ovvero un ritorno a
capo, con i due OS).
E ancora, ho selezionato "Add lock for write around 'INSERT' statements" e "Insert 'CREATE
TABLE' statements", entrambi utili nel mio caso specifico.
Se ci interessasse, potremmo anche selezionare la possibilit di creare un nuovo database all'interno
di MySQL oppure di inserire dei commenti... cosa che a me assolutamente non interessava.
Il passo successivo, quello sulla sicurezza di Access, l'ho saltato e ho poi specificato il percorso del
file .mdb e la directory dove salvare il file .sql contenente il file di DUMP. In questo caso, se il
database Access protetto da password, possibile specificare la parola chiave:
Se si cliccasse sulla voce "Convert table definitions only", Access To MySQL creerebbe il file di
DUMP solo per importare la struttura della tabella, senza includere i records presenti.
La finestra seguente, rileva le tabelle di Access e ci chiede quali di queste vogliamo convertire su
MySQL. Selezionamo quelle che ci interessano e passiamo avanti:
L'ultima finestra ci avviser di aver terminato il lavoro. Ora possiamo aprire il file .sql che abbiamo
salvato nel terzo passaggio. Il codice interno SQL, per fare un esempio, abbiamo convertito una
semplice tabella Access e pubblichiamo qui il codice SQL per inserirla in MySQL (il file DUMP in
pratica):
DROP TABLE IF EXISTS `controllovoti`;
CREATE TABLE `controllovoti` (
`id` INT NOT NULL AUTO_INCREMENT,
`idrisorsa` INT NOT NULL DEFAULT 0,
`ip` VARCHAR(50),
`data` CHAR(19),
INDEX `id` (`id`),
INDEX `idrisorsa` (`idrisorsa`),
PRIMARY KEY `PrimaryKey` (`id`)
);
LOCK TABLES `controllovoti` WRITE;
INSERT INTO `controllovoti` VALUES(2, 1, '127.0.0.3', '2001-11-09 21:45:19');
INSERT INTO `controllovoti` VALUES(3, 1, '127.0.0.2', '2001-11-09 21:48:19');
INSERT INTO `controllovoti` VALUES(4, 1, '127.0.0.4', '2001-11-09 21:49:19');
INSERT INTO `controllovoti` VALUES(5, 3, '127.0.0.5', '2001-11-09 22:38:46');
INSERT INTO `controllovoti` VALUES(6, 3, '127.0.0.1', '2001-11-11 01:26:10');
UNLOCK TABLES;
ALTER TABLE `controllovoti` CHANGE `data` `data` DATETIME;
Ora possiamo effettuare una query al database MySQL con i comandi del file di DUMP. Da
possibile effettuarla attraverso l'apposita textarea copiando e incollando il codice
SQL. Se il file troppo lungo, possiamo sfruttare la possibilit di effettuare query da un file di testo,
attraverso l'apposito comando sfoglia:
PhpMyAdmin
l sofware di gestione di MySQL da remoto (in questo caso PhpMyAdmin) una volta portata a termine
la query (pu volerci qualche secondo se il file di DUMP molto lungo) ci avviser dell'esito
finale. Nel mio caso stato positivo, e ho cos potuto concentrarmi sull'inserimento dei records
mancanti. Ricordo infatti che Access to MySQL demo importa solo 5 records.
Nota: chi vuole, pu comunque comprarsi la versione definitiva del software di conversione, che
nella soluzione base costa meno di 40 dollari, ma a me piace sviluppare e imparare e cos ho fatto
da solo. Per chi volesse, sono disponibili maggiori informazioni
Riprendendo il filo del discorso, mi sono creato un file .asp che interrogasse il database Access e
restituisse la sintassi SQL e quindi il file di DUMP. Ecco cosa ho scritto:
<%
dim strConn
strConn="Provider = Microsoft.Jet.OLEDB.4.0; Data Source =
"&Server.MapPath("/percorso_del/db.mdb")&"; Persist Security Info = False"
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open strConn
set rs = Server.CreateObject("ADODB.Recordset")
sql = "SELECT * FROM controllovoti WHERE id > 5"
rs.open sql, conn, 1, 3
do while not rs.eof
response.write("INSERT INTO `controllovoti` VALUES(" & rs("id") & ", '" &
rs("idrisorsa") & "','" & rs("ip") & "','" & Rs("data") & "');" & VbCrLF)
rs.movenext
loop
rs.close
set rs=Nothing
conn.Close
set conn=Nothing
%>
Una volta ottenuto il codice, ho visualizzato l'HTML e mi sono salvato il codice prodotto. Poi ho
aperto PhpMyAdmin alla tabella che mi interessava e ho eseguito la query attraverso il file salvato.
In questo modo, avevo convertito il mio database da Access a MySQL, senza spendere un euro e in
5 minuti di tempo.
supporta la paginazione dei dati attraverso l'istruzione LIMIT, che limita appunto
l'estrapolazione di dati. Una query simile:
SELECT * FROM dati LIMIT 1,5
Specifica a MySQL di prendere i records dal primo al quinto all'interno della tabella dati. I due valori
che seguono l'istruzione LIMIT, indicano da quale record iniziare a prendere i dati e quanti
prenderne (1,5: per l'appunto dal primo record, prendine cinque).
Se avessimo voluto prenderli dal ventesimo al trentesimo, avremmo scritto:
SELECT * FROM dati LIMIT 20,10
Ovvero, partendo dal ventesimo record, prendine 10
Abbiamo visto che l'istruzione LIMIT circoscrive la quantit di informazioni da ricavare dal
database. Quando per si ha la necessit di paginare i dati, importante che gli estremi della
propriet LIMIT vengano calcolati dinamicamente.
Questo perch necessario indicare ogni volta da che record partire l'estrazione e a quale fermarsi.
Ammettiamo di voler estrarre 5 records per pagina, la query dovrebbe essere:
SELECT * FROM dati LIMIT 1,5
Per la prima pagina, ma poi per la seconda sar:
SELECT * FROM dati LIMIT 6,5
E per la terza:
SELECT * FROM dati LIMIT 11,5
E cos via... Questi due valori da indicare a LIMIT vanno ricavati dinamicamente, ovvero ad ogni
pagina deve corrispondere il record iniziale e finale dell'estrazione, fermandosi quando i records
saranno terminati.
In questo modo con la voce totale avremo il numero di records estratti dalla query.
Da questo punto in poi andremo avanti con le ASP, ma tradurre il codice in PHP (o altri linguaggi)
davvero molto semplice. Si tratta solo di costrutti if e calcoli matematici.
Prepariamo la paginazione
Con la query di prima, avevamo ricavato il totale di record estratti. Ora possiamo calcolarci
dinamicamente i vari valori di LIMIT. Attraverso queste semplici istruzioni:
dim pagina
pagina = Cint(request.querystring("pag"))
if pagina<=0 then pagina=1
SQLcount = "SELECT COUNT(NomeTabella.NomeCampo) AS totale FROM NomeTabella
GROUP BY NomeTabella.id"
Set adoRstCount=adoCon.Execute(SQLcount)
PageSize = 5
' Quanti records per pagina
inizio = (pagina-1)*PageSize
' il primo record di ogni pagina
totali = Cint(adoRstCount("totale"))
' Quanti records abbiamo estratto dalla query
NumPagine = totali/PageSize
' Quante pagine abbiamo ottenuto
' L'if successivo serve ad arrotondare per eccesso il numero di pagine
' nel caso in cui ottenessimo un numero decimale
' ad esempio 20 records da distribuire in 6 pagine
If NumPagine-Cint(NumPagine) > 0 Then
NumPagine = Cint(NumPagine+1)
Else
NumPagine = Cint(NumPagine)
End If
adoRstCount.Close
Set adoRstCount=Nothing
In questo modo, all'interno delle variabili:
PageSize: abbiamo i records da distribuire in ogni pagina.
inizio: Il primo valore da assegnare a LIMIT.
NumPagine: Il numero totale di pagine.
Eseguiamo la query
Con le variabili ottenute, ora sufficiente ricostruire la query dinamica. Apriamo quindi una nuova
Conclusioni
Abbiamo visto come paginare i dati con un database MySQL. Riassumendo, il codice si compone di
tre parti fondamentali:
1. Otteniamo il totale di records con una query ad hoc usando l'istruzione COUNT()
2. Prepariamo le variabili per la paginazione dei dati
3. Eseguiamo l'ultima query con le variabili precedentemente ottenute
roberto
Roberto
ROBERTO
romolo
Rho
Ma non stringhe tipo "ro". Perch tra il carattere "r" e "o" ci dovr essere almeno un altro carattere.
Neppure termini come "alrogo" o "arrotare" sarebbero accettati, perch la stringa dovr iniziare con
"r" e finire con "o".
[[:<:]]stringa[[:>:]] cerca il termine "stringa" che sia una parola a s stante (ovvero separata
da ci che c' prima e dopo da almeno uno spazio ("questa una stringa per MySQL"
sarebbe accettato ma "questa una megastringa per MySQL" non sarebbe accettato).
titolo
descrizione
attinenza
7.212370387556
4.86869959964
3.8611711513829
6.1195414142892
5.233245521266
3.6027420458677
3.4924819304996
2.4627044551326
2.254412718088
Questo sistema di query Full text pu esserci molto utile se volessimo ordinare i risultati di una
ricerca in base alla rilevanza di una parola, proprio come fanno i motori di ricerca pi blasonati, che
ordinano le varie pagine trovate in base a degli algoritmi propri.
mysql phpmyadmin:
Trova uno dei termini nei campi specificati
+mysql +phpmyadmin:
Nella ricerca, dovranno essere presenti entrambi i campi
+mysql phpmyadmin:
Seleziona i campi con entrambe le parole, ma assegna un'attinenza maggiore al termine
premesso da +
+mysql -phpmyadmin:
Cerca i campi che contengono mysql ma non phpmyadmin
+mysql +(>sql <php):
Trova mysql con sql o mysql con php ma assegna un'attinenza maggiore a mysql con sql
piuttosto che a mysql con php
my*:
Estrarr tutti i campi che contengono il termine my seguito da altri caratteri. Come mysql,
myadmin, myodbc ecc.
"query mysql":
Trover termini come "query mysql con phpmyadmin" ma non "query SQL con mysql su
phpmyadmin". Ci significa che, includendo i termini tra virgolette, si vuole che la ricerca
venga effettuata sulla esatta posizione delle due o pi parole.