(eBook - Ita) - Informatica - Manuale Base Mysql

download (eBook - Ita) - Informatica - Manuale Base Mysql

of 40

Transcript of (eBook - Ita) - Informatica - Manuale Base Mysql

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    1/40

    Installazione di MySQL su Linux

    MySQL distribuito gratuitamente per Linux sul sito http://www.mysql.com. Di solito l'ultimaversione stabile viene identificata come "recommended". Vedremo come installare MySQL

    partendo dai file mysql - xxx. t ar . gz(dove xxxsta 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.

    t ar xzf mysql - xxx. t ar . gzcd 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 diinstallazione: 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 sembrapi comodo.

    . / conf i gur e - - pr ef i x=/ usr/ l ocal / mysql

    Adesso vedrete molte schermate di configurazione, teneto sott'occhio il README e fate attenzionealle opzioni proposte. Finita questa parte siete pronti per lanciare la compilazione vera e propria:

    make

    Il programma adesso installato, ma necessario compiere ancora qualche operazione prima diessere operativi. La prima quella di installare i file che permetteranno a MySQL di funzionare.Rimanete nella stessa directory dalla quale avete lanciato gli altri comandi e digitate:

    scr i pt s/ mysql _i nstal l _db

    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 programmadovrete solamente scompattare nuovamente mysql - xxx. t ar . gz.

    Avviamo il server:

    mysql d

    Per controllare che tutto funzioni correttamente digitate

    mysql admi n - u root st atus

    Adesso potete vedere il paragrafo sulla configurazione di MySQL per iniziare a lavorare con ildatabase.

    Configurazione di MySQL su Windows e LinuxAdesso che il server MySQL installato e attivo, la prima cosa da fare quella di impostare una

    password per l'utente root, ovvero l'utente che in grado di compiere tutte le operazioni su MySQL,compresa quella di fermare il server. MySQL permette l'accesso ai dati contenuti nei databaseesclusivamente agl utenti autorizzati, per questo importante creare da subito degli utenti cheabbiano delle possibilit di azione limitate per evitare seri problemi di sicurezza. Appena installato,MySQL ha un utente "root" che pu accedere senza inserire alcuna password, in grado di compierequalsiasi azione sul server. Quindi la prima cosa da fare adesso quella di assegnare una passworda "root" in modo da evitare che chiunque possa entrare e fare danni senza incontrare alcun blocco.Attenzione perch quello che stiamo per fare estremamente importante: MySQL un server e in

    quanto tale esso permette l'accesso a chiunque si trovi nella stessa rete. Questo significa che se ilserver collegato a Internet, CHIUNQUE potr accedere al server! Naturalmente la possibilit di

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    2/40

    effettuare delle operazioni su di esso sar vincolata al fatto di avere un nome utente e una passworddi accesso.

    Iniziamo assegnando una password all'utente "root". La password va inserita tra virgolette, comenell'esempio.

    mysql admi n - u root password "mi a_password"

    Per assicurarci che MySQL abbia registrato il cambiamento, ricarichiamo le tabelle di accesso:

    mysql admi n - u r oot r el oad

    Se appare un messaggio d'errore, va tutto bene :)) Questo infatti significa che d'ora in poi dovreteinserire la password per operare sul server.

    Proviamo ora a vedere se la password viene riconosciuta, ad esempio esaminando i parametri dilavoro del server:

    mysql admi n - u r oot - p st atus

    Appena premuto invio vi verr richiesta la password. Mentre la scriverete non apparir nulla; nonpreoccupatevi, una misura di sicurezza per evitare che qualche curioso, sbirciando, riesca a vederequanto lunga la password.- u r oot indica a MySQL che volete accedere con il nome utente "root"; - pindica che vi dovressere richiesta la password per eseguire l'operazione. Come abbiamo visto omettendo - pil serversi rifiuta di compiere l'operazione.

    Adesso dovrete inserire la password anche per fermare il server:

    mysql admi n - u r oot - p shut down

    I tipi di campi in MySQL

    I tipi di campi numerici in MySQLQuando si va ad assegnare un campo di tipo numerico, importante sapere quale scegliere,cos da non trovarsi con una tabella che va sistemata o ritoccata per contenere i dati.

    Ci sono casi in cui, quando si certi che il database dovr contenere una piccola quantit didati, si va erroneamente a identificare comunque un campo di tipo INT, quando magari unTINYINTfarebbe comunque lo stesso lavoro in maniera egregia.

    Ma perch scervellarsi per trovare il tipo di dato numerico adatto? Per risparmiare spazio emigliorare le prestazioni del database. Se avessimo una tabella di nome "admin" con usernamee password dell'amministratore unico del sito, bene evitare di scegliere un campoeccessivamente grande (come pu essere BIGINT) perch occuperemo spazio inutile e

    peggioreremo le prestazioni di MySQL.

    Nome deltipo

    Memoriaoccupata

    Intervallo di valori consentitoSe 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 byteda -9223372036854775808 a+9223372036854775807

    da 0 a+18446744073709550615

    FLOAT(I,D) 4 byte A seconda dei valoriDOUBLE(I,D) 8 byte A seconda dei valori

    DECIMAL(I,D) Il peso di I + A seconda dei valori

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    3/40

    2 ByteI e D rappresentano i numeri Interi e Decimali ammessi.

    Un approfondimento lo meritano i tipo FLOAT, DOUBLEe DECIMAL.Ad esempio FLOAT(2,3)indica a MySQL di salvare fino a due cifre per la parte intera di unnumero e 3 per quella decimale. I numeri quindi saranno salvati fino a 99.999. Numeri con

    valori diversi, verranno arrotondati. Un numero come 45,7869 diventer 45,787. DOUBLEeDECIMALfunzionano nella stessa maniera ma possono contenere valori maggiori (e quindioccupano pi spazio).

    Eccezioni dei valori nei dati di tipo numericoSe all'interno di un campo di tipo numerico si specifica un valore maggiore di quanto ammesso,MySQL salver nel database il massimo numero ammesso per quel campo. Per spiegare meglioil concetto, ammettiamo di avere un campo TINYINT(UNSIGNEDovvero privo di segno, quindipositivo: da 0 a 255): se provassimo ad inserire un valore pari a 4587, MySQL salver 255come valore.E' importante quindi porre molta attenzione nella scelta dei campi di tipo numerico. Ancheperch sono i dati a cui MySQL accede pi rapidamente.

    I modificatori dei tipi numerici: AUTO_INCREMENT, UNIQUE eZEROFILLIl primo modificatore,AUTO_INCREMENT, permette di creare un campo numerico che aumentaogni nuova riga. Quindi, aggiungendo un record a uno gi presente, il valore del campo autoincrementale sar 2. Se si cancellasse questo ultimo record e se ne aggiungesse un altro, ilvalore del nuovo campo AUTO_INCREMENTsar 3. Questo perch, anche se una riga statacancellata, MySQL si ricorda il valore massimo e a questo aggiunge ogni volta una unit. Non possibile modificare il valore che viene sommato alla nuova riga ( e resta +1).E' consigliabile utilizzare sempre un campo auto incrementale a cui fare riferimento perselezionare, modificare o cancellare i record. Tenetevi quindi sempre da parte un campo(magari di nome "id") di tipo auto incrementale. Sar comodissimo in molti casi.

    Il secondo modificatore per i dati numerici, UNIQUE, identifica un campo i cui valori sono unodiverso dall'altro. Se si tenta di aggiungere un record con lo stesso valore, MySQL genera unerrore tipo:

    1062 - Duplicate entry 'N' for key N

    L'ultimo modificatore ammesso da MySQL per i campi numerici ZEROFILL, che consente diinserire tanti 0 quanti sono ammessi dal tipo di campo, prima della cifra che realmente vienesalvata. Ad esempio, con un campo di tipo INT(5)e ZEROFILL, per salvare un numero come 78,questo verr immagazzinato nella forma 00078. Pu essere utile per salvare dati bancari cheprevedono una lunghezza fissa, come ABI, CAB o numero di conto corrente.

    I tipi di campi stringhe in MySQLUn tipo di dato stringa un campo che pu contenere qualunque tipo di carattere: numerico,alfanumerico, simboli ecc.Come per i campi numerici ce ne sono di vari tipi, a seconda della quantit di dati che si vuolesalvare.

    Nella tabella seguente, maggiori informazioni:

    Nome del tipo Dimensioni massime Memoria occupataCHAR 255 byte X byte (*)

    VARCHAR 255 byte X+1 byte (*)

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    4/40

    TINYTEXT 255 byte X+1 byte (*)

    TINYBLOB 255 byte X+2 byte (*)

    TEXT 65535 byte X+2 byte (*)

    BLOB 65535 byte X+2 byte (*)

    MEDIUMTEXT1,6 MB X+3 byte (*

    )MEDIUMBLOB1,6 MB X+3 byte (*)

    LONTEXT 4,2 GB X+4 byte (*)

    LONGBLOB 4,2 GB X+4 byte (*)

    (*) X lo spazio occupato dal testo all'interno del campo

    CHAR e VARCHARQuesti due tipi di campi, nonostante la somiglianza nel nome, si comportano in maniera moltodiversa. 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", questocampo occuperebbe comunque 9 byte invece di 4. Con VARCHAR(9) invece, scrivendo al suointerno "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 nellastessa tabella, uno CHAR e l'altro VARCHAR, MySQL render entrambi VARCHAR, come

    possibile vedere dall'immagine seguente, realizzata con PhpMyAdmin.

    TEXT e BLOBTEXT e BLOB sono i campi di MySQL dedicati a contenere grandi quantit di dati. Fino a 4,2 GBcon i LONGTEXT e LONGBLOB.Il secondo in particolare, il campo di tipo BLOB sta per Bynary Large Object e consente ilsalvataggio 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 inclusodirettamente nel database).

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    5/40

    I modificatoriI 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 fosselasciato 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 aimpostare un indice i quali dati non devono essere vuoti.

    Gli altri modificatori: UNIQUE, UNSIGNED e ZEROFILL sono stati trattati nella puntata dedicataai tipi di dati numerici.

    I tipi di campi data in MySQLI tipi di campi data sono tutti quei campi che contengono come valore la data e/o l'ora.

    Nella tabella che segue, li mostriamo uno ad uno:

    Nome del tipo Formato Se vuoto (zero)

    DATETIME AAAA-MM-GG hh:mm:ss 0000-00-00 00:00:00

    DATE AAAA-MM-GG 0000-00-00

    TIME hh:mm:ss 00:00:00

    YEAR AAAA 0000

    TIMESTAMP(2) AA 00

    TIMESTAMP(4) AAMM 0000

    TIMESTAMP(6) AAMMGG 000000

    TIMESTAMP(8) AAAAMMGG 00000000

    TIMESTAMP(10)AAMMGGhhmm 0000000000

    TIMESTAMP(12)AAMMGGhhmmss 000000000000

    TIMESTAMP(14)AAAAMMGGhhmmss 00000000000000

    A=anno, M=mese, G=giorno, h=ora, m=minuti, s=secondi

    DATETIMEE' il formato pi completo e preciso a nostra disposizione. Varia da 1000-01-01 00:00:00 a 9999-12-31 23:59:59

    DATEUguale al precedente, ma senza l'ora. Ammette infatti dati a partire da 1000-01-01 al 9999-12-31.

    TIME

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    6/40

    Salva l'ora. I valori vanno da 00:00:00 a 23:59:59. E' possibile per salvare intervalli di valore traun evento e un altro e qundi, ammettere ore differenti. In questo caso, i dati vanno da -838:59:59 a838:59:59.MySQL legge i valori partendo da destra, quindi, salvando un campo con il contenuto 8:32, neldatabase 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).

    YEARSalva 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 ivalori 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.

    TIMESTAMPQuesto campo salva (nel formato scelto dal numero tra le parentesi, si veda la tabella superiore) ilmomento esatto in cui la tabella viene modificata. Quindi pu essere utile per visualizzare (senzadoverlo calcolare ogni volta) il momento dell'ultima modifica del record in cui il campoTIMESTAMP 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 variformati? Perch MySQL salva comunque tutti i dati e poi ne visualizza solo quelli richiesti. Adesempio, con TIMESTAMP(2) il database visualizza solo due cifre dell'anno, ma in memoria hatutti gli altri dati (anno a 4 cifre, mese, giorno, ora, minuti e secondi). Quando infatti modifichiamoil 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

    Altri tipi di campi in MySQLI tipi di campi che ancora non abbiamo trattato sono i campi a scelta. Quando l'utente dovrselezionare per forza una delle voci previste (ad esempio da un men a tendina: ) bene

    porre la propria attenzione su questi campi, perch MySQL ci accede pi rapidamente di quellitestuali.

    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 valorivuoti (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 (chechiameremo "scelta_vacanze") possibile selezionare una voce come se ci si trovasse di fronte a unarray (che parte da 1 come in VB e derivati - tipo VBScript).

    Ad esempio, con:

    SELECT scelta_vacanze FROM nomeTabella WHERE scelta_vacanze = 2

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    7/40

    Avremo come risultato il valore "montagna".

    SETQuesto 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 PhpMyAdminPhpMyAdmin un'interfaccia grafica sviluppata in Php in grado di interagire con database MySQLsenza la necessit di scrivere alcuna riga di codice SQL. Tutti gli RDBMS infatti sono interrogabiligrazie a tools di amministrazione (come ad esempio "SQL Server Enterprise Manager" perMicrosoft SQL Server, "Toad" per Oracle e "pgAdmin3" per PostgreSQL) oppure da complesselinee di codice SQL (Structured Query Language).

    Il progetto PhpMyAdmin raggiungibile all'indirizzo http://www.phpmyadmin.nete rilasciatosotto licenza GNU, ovvero distribuibile gratuitamente con i relativi codici sorgenti. Disponibile inoltre 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 queriescollegando 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

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    8/40

    r) trasformare i dati salvati in qualsiasi formato utilizzando un set di funzioni predefinite, adesempio la visualizzazione di dati BLOB come immagini o link per il download...

    s) supportare le tabelle e le chiavi esterne (straniere) InnoDB

    t) offrire un'interfaccia grafica in una delle supportate

    Installazione e configurazionePer prima cosa occorre scaricare l'ultima versione stabile del programma all'indirizzowww.phpmyadmin.net/home_page/downloads.php

    A)Decomprimere (untar o unzip) la distribuzione nella directory root del server Web (o dellocalhost). Se non si avesse l'accesso diretto alla cartella root, consigliabile inserire i file in unadirectory sulla macchina locale, e, una volta configurato il tutto, trasferire la cartella sul server Webutilizzando, ad esempio, il protocollo FTP. Con sistemi Windows e Mac il pacchetto si estrarravvalendosi 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. Adesempio, "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 sitratti di una intranet o che si preferisca un metodo di autenticazione basato su HTTP o cookie) adesempio 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

    Amministrare MySQL con PhpMyAdmin

    Creazione e cancellazione database MySQLSe godiamo di diritti particolari sul server (oppure lavoriamo su un db locale) PhpMyAdmin hafunzioni avanzate di creazione e cancellazione di database MySQL. L'operazione risulta elementaree di immediata esecuzione, infatti come possiamo notare dalla pagina principale, la prima voce nelframe a destra ed esattamente nella sezione dedicata a MySQl c' "Crea un nuovo database".

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    9/40

    Stesso discorso vale per la cancellazione, nella pagina "SQL", vi dovrebbe essere un linkdenominato "Elimina database".

    Creazione e cancellazione di una tabella

    Per creare una nuova tabella necessario posizionarsi sul database, che nel nostro esempio sichiama "odns":

    In fondo alla pagina apparir il form per scegliere il nome della nuova tabella e il numero di campida 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 precedentisu MySQL) , per questa recensione sufficiente nominare i campi ad esempio: pippo1, pippo2,

    pippo3 ed impostare la dimensione del campo (ad esempio 10).

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    10/40

    Premuto il bottone Salva, PhpMyAdmin visualizzer la query SQL ed offrir all'amministratore lapossibilit di studiare il codice Php generato. Ora nel database "Odns" vi una nuova tabelladenominata "prova".

    Modifica e cancellazione di tabelle in MySQLPosizionandoci sulla tabella, PhpMyAdmin mostra le caratteristiche principali della tabella stessa

    (dimensioni, data di creazione e ultima modifica). Inoltre un Menu per effettuare tutte le operazioninecessarie alla gestione della tabella. Vediamo nel nostro esempio con la tabella "prova" cosa cipermette di fare PhpMyAdmin:

    La prima pagina, appena scelta la tabella, denominata "Struttura", dove abbiamo appena descrittol'utilit: visualizza i campi e ne descrive le peculiarit.

    Con la voce "Mostra"si ha la possibilit di visualizzare il contenuto dei campi, di defaultimpostato 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 suaottimizzazione e/o copiatura.

    Grazie al campo "Svuota"tutti i dati presenti nella tabella verrano eliminati, mantenendo per lastruttura della tabella e soprattutto se si avessero dati autocrementali il primo record ripartirebbe da1.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    11/40

    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 lavoce

    Modifica e cancellazione di campi in MySQLMYSQL:PHPMYADMIN

    Risorse.net

    Per modificare o cancellare un campo sufficiente posizionarsi sulle icone presenti nella "Struttura"tabella. Di seguito l'immagine che chiarisce il tutto:

    La prima icona modifica il campo, la seconda lo cancella, la terza aggiunge il modificatorePRIMARY KEY, la quarta aggiunge un indice, la quinta aggiunge il modificatore UNIQUE, lasesta aggiunge l'indice FULLTEXT. Per chiarimenti sui modificatori, rimandiamo alla puntata dellaguida a MySQL dedicata ai tipi di campi.

    L'indice FULLTEXT merita un approfondimento. Per sfruttare le query di tipo Full Textsi ha lanecessit di avere un indice multiplo, mentre PhpMyAdmin imposta indici FULLTEXT unici(anche se supporta e visualizza correttamente gli indici FULLTEXT multipli). Per sapere come faree cosa sono le query Full Text, rimandiamo alla puntata dedicata proprio alle query

    Backup e ripristino del database MySQLMYSQL:PHPMYADMIN

    Risorse.net

    Per effettuare una copia di sicurezza (detto anche dump) del proprio database MySQL, occorreselezionare dal menu a destra la voce Home e dal frame a destra selezionare la voce "Esporta",come raffigurato dall'immagine sottostante:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    12/40

    L'esportazione un'operazione che raccomandiamo a tutti di eseguire periodicamente, anche perchcon il tool PhpMyAdmin un lavoro che dura pochi minuti (anche con database molto corposi).

    Per fare in modo di avere una copia perfetta, la redazione di Risorse.net,per questa prova ha decisodi fleggare le voci "Aggiungi DROP DATABASE" e "Aggiungi Drop table"; il motivo semplice,in caso di ripristino, la copia sovrascriver tutto il vecchio database.Di seguito l'immagine della finestra di PhpMyAdmin:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    13/40

    Simuliamo ora un danneggiamento del database di prova di Risorse.net, il db "odns". Avendoprudenzialmente effettuato la copia, il compito del ripristino davvero un'operazione semplice.Utilizzando PhpMyAdmin, entriamo nel db (se esiste ancora) e selezionamo la voce "SQL".

    Scegliamo Percorso del file, tramite il bottone "Sfoglia" e aprendo il file .sql precedentementesalvato eseguiamo la query.Ecco la pagina di PhpMyAdmin che raffigura il processo:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    14/40

    SQL di baseSQL, acronimo di Structured Query Language, un linguaggio utilizzato per manipolare database.MySQL sfrutta proprio SQL per interagire con gli utenti, attraverso dei comandi comunementechiamati query.Una query permette di "parlare" al database e consente di effettuare operazioni sul suo contenuto osulla sua struttura.

    Per selezionare i campi di un database, si usa il termine SELECT. Ammettiamo di dover estrarre ilcontenuto 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 termineFROM permette di identificare il nome della tabella dalla quale estrapolare i dati. Se volessimoinvece estrarre un solo campo, inutile estrarli tutti e potremmo quindi usare il nome specifico, adesempio:

    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;

    Affinare la query: la clausola WHEREPu essere necessario specificare meglio una query in modo tale da avere un risultato vicino allenostre esigenze. Ad esempio, potremmo voler estrarre solo i nomi dei clienti della citt di Milano,ecco come fare:

    SELECT nome FROM clienti WHERE citta = 'milano';

    In questo modo, avremo come risultato solo i nomi dei clienti che hanno sede a Milano.

    Pi in profondit: AND e OR

    Facendo riferimento all'esempio di prima, potremmo richiedere i nomi dei clienti che hanno sede aMilano e hanno effettuato pi di 10 ordini. Ecco come:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    15/40

    SELECT nome FROM clienti WHERE citta = 'milano' AND ordini

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    16/40

    I pi usati sono:

    ==!=LIKE

    I primi cinque operatori, sono uguali a tutti gli altri linguaggi di scripting o di programmazione eidentificano:

    MinoreMaggioreMinore o uguale

    Maggiore o ugualeUgualeDiverso

    Un approfondimento a parte merita LIKE, che consente di effettuare una comparazione tra campisimili, anche non uguali.

    Ad esempio, ammettiamo di voler estrarre, dalla tabella clienti, quelle aziende che contengano nelladescrizione 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 termineinternet, potrebbero esserci altre parole. Se non avessimo usato questa query, magari usandoWHERE descrizione = 'internet', il database avrebbe cercato quelle aziende che contengano nelcampo 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 daaltro testo, ad esempio: Milano, Milazzo, Milano Marittima ecc.

    Operatori matematiciCon MySQL possibile eseguire delle query utilizzando all'interno della sintassi SQL deglioperatori matematici, che sono i classici della somma, sottrazione, moltiplicazione e divisione.

    SommaPossiamo 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

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    17/40

    due campi.

    DifferenzaCome per la somma, possiamo fare:

    SELECT (primoCampo - secondoCampo) AS differenza FROM nomeTabella;

    MoltiplicazioneAll'interno delle query possibile anche moltiplicare i valori di pi campi, ad esempio:

    SELECT (primoCampo * secondoCampo) AS risultato FROM nomeTabella;

    DivisioneE ancora, per la divisione, possiamo usare:

    SELECT (primoCampo / secondoCampo) AS risultato FROM nomeTabella;

    Elevazione a potenzaL'elevazione a potenza con MySQL si pu ottenere usando due funzioni: POW(x,y) oPOWER(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 praticiGli operatori matematici possono essere molto comodi anche per ordinare dei risultati. Ammettiamodi avere una tabella che contenga i voti totali assegnati a un articolo e il numero di persone chehanno 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 crearciun campo provvisorio con il comando AS, ecco come:

    SELECT (voti_totali / numero_voti) AS mediaVoto, id, titolo FROM articoli ORDER BYmediaVoto DESC.

    Altri operatori e funzioni matematicheNella puntata dedicata agli operatori matematici di base, abbiamo visto le sintassi SQL pereseguire calcoli su un RDBMS MySQL.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    18/40

    In questa puntata vedremo gli operatori pi avanzati, che consentono i calcoli di logaritmi, seni ecoseni, tangenti, archi e arrotondamenti.

    LEASTLa 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

    GREATESTFunzione simile alla precedente, ma ricava il numero pi grande. Tipo:

    SELECT GREATEST(1, 4, 5, 8.6, 0.9);

    Restituisce: 8.6

    MODQuesta funzione da' come risultato il resto di un numero (passato come primo parametro) diviso perl'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

    CEILINGQuesta funzione molto simile alla FLOOR ma esegue l'arrotondamento al valore minore noninferiore alla cifra stessa. Ecco il solito esempio "schiarsci-idee":

    SELECT CEILING(11.5);

    Restituisce: 12

    ROUNDA 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

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    19/40

    inferiore alla cifra stessa (proprio come la funzione FLOOR). Ad esempio:

    SELECT ROUND(12.5);

    Restituisce: 12

    EXPLa funzione EXP restituisce la base dei logaritmi naturali elevata alla potenza della cifra indicata.Ecco come:

    SELECT EXP(2);

    Restituisce: 7.389056

    LOGQuesta funzione da' come risultato il logaritmo naturale del numero indicato. Ecco:

    SELECT LOG(12);

    Restituisce: 2.484907

    LOG10Questa funzione, simile alla precedente, restituisce il logaritmo del numero specificato in base 10.

    SELECT LOG10(12);

    Restituisce: 1.079181

    SIGNLa funzione SIGN consente di ottenere tre risultati diversi in base al segno della cifra indicata. Unnumero 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

    SINLa funzione SIN ottiene il seno di una cifra data in radianti:

    SELECT SIN(10);

    Restituisce: -0.544021

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    20/40

    COSQuesta funzione calcola il coseno di un numero dato in radianti:

    SELECT COS(10);

    Restituisce: -0.839072

    TANLa funzione TAN calcola la tangente di un numero espresso in radianti:

    SELECT TAN(10);

    Restituisce: 0.648361

    ASINQuesta funzione calcola l'arco seno di un numero. Restituisce NULL se la cifra non fosse compresatra -1 e 1.

    SELECT ASIN(-0.5);

    Restituisce: -0.523599

    ACOSSimile alla precedente, ma restituisce ovviamente l'arco coseno della cifra indicata quandoquest'ultima fosse compresa tra -1 e 1. Altrimenti restituirebbe NULL.

    SELECT ACOS(-0.5);

    Restituisce: 2.094395

    ATANQuesta restituisce invece l'arco tangente della cifra indicata:

    SELECT ATAN(3);

    Restituisce: 1.249046

    ATAN2Questa restituisce invece l'arco tangente delle due cifre indicate, tipo:

    SELECT ATAN2(3,4);

    Restituisce: 0.643501

    COTLa funzione COT restituisce la cotagente della cifra data, ad esempio:

    SELECT COT(5);

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    21/40

    Restituisce: -0.29581292

    DEGREESQuesta funzione converte i numeri da radianti a gradi:

    SELECT DEGREES(2);

    Restituisce: 114.59155902616

    RADIANSEffettua l'operazione inversa della funzione precedente. Ovvero partendo da un numero in gradi, loconverte in radianti.

    SELECT RADIANS(114.59155902616);

    Restituisce: 1.9999999999999

    Funzioni condizionaliLe funzioni condizionali di MySQL consentono di eseguire query verificando che un'istruzione siavera o falsa.Come per tutti i linguaggi di programmazione, la condizione e il relativo comportamente vienesuddiviso su tre passaggi:

    1. La condizione2. 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 IFLa funzione IF permette di confrontare dei campi e restituire delle istruzioni diversi a seconda dellaveridicit della condizione iniziale:

    SELECT IF(primoCampo != secondoCampo, 1, 0) FROM nomeTabella;

    Con questo tipo di query, MySQL confronta il primoCampo con il secondoCampo. Se fosserodiversi, restituirebbe 1, altrimenti 0.

    Vediamo un caso banale ma pratico. Possiamo effettuare la verifica condizionale IF anche con deinumeri. Ad esempio:

    SELECT IF(1

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    22/40

    restituire. IFNULL infatti intercetta i casi di NULL e restituisce ci che il database administratordesidera.

    Pu essere utile quando si divide un campo per un altro quando non si sa cosa contengano i duecampi (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 questoproblema, 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".

    CASEQuesto condizionale consente a MySQL di verificare pi campi, come per il Select Case di VisualBasic 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 MySQLrestituisce 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 aggregateLe funzioni aggregate servono per eseguire operazioni matematiche su una o pi colonne diMySQL.

    COUNTLa 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 iltermine "tennis" e le ultime 2 con "golf", effettuando un COUNT(DISTINCT) avremo il numero dicombinazioni 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 undeterminato sito, SELECT COUNT(DISTINCT) pu essere utile per sapere quanti nomi diversisono stati usati, oppure quanti diversi titoli di studio ecc.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    23/40

    MAXQuesta funzione restituisce il valore pi alto contenuto all'interno di una colonna. Per i campinumerici, 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;

    MINQuesta funzione fa esattamente l'opposto della precedente: prende il valore pi basso. Ecco unesempio:

    SELECT MIN(nomeCampo) FROM nomeTabella;

    AVGRestituisce una media dei valori presenti in un campo. Da applicare ai soli campi numerici:

    SELECT AVG(nomeCampoNumerico) FROM nomeTabella;

    SUMLa funzione SUM somma i valori contenuti nel campo:

    SELECT SUM(nomeCampoNumerico) FROM nomeTabella;

    Anche questa funzione, va applicata ai soli campi numerici.

    STDQuesta una funzione utile per gli statistici. Calcola infatti la distanza di un valore dalla media, e siottiene con:

    SELECT STD(nomeCampoNumerico) FROM nomeTabella;

    GROUP BYLa clausola GROUP BY consente di raggruppare un set di risultati in presenza di una delle funzioniaggregate 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 ordinie "cliente" contenente appunto il nome del cliente.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    24/40

    Nomi di tabelle e campi in MySQLNella puntata SQL di baseall'interno di questa guida a MySQL, abbiamo visto che SQL a tutti glieffetti un linguaggio. In quanto tale, ha regole grammaticali e strutturali che vanno rispettate, cosda interagire alla perfezione con il database.

    Tra queste regole, come per quasi tutti i linguaggi, esistono nomi riservati che non possono essereutilizzati:

    ALTERANDASCREATECROSS JOINDELETEDROP

    FROMFULL JOINGROUP BYINSERTINTOJOINLEFT JOINLIKELIMITONOR

    ORDER BYRIGHT JOINSELECTSETUPDATEWHERE

    Altri consigli nell'assegnazione dei nomiQuando andiamo assegnare i nomi delle nostre tabelle e dei nostri campi, esistono altre piccoleregole che meglio seguire. E' bene evitare caratteri particolari all'interno dei nomi. Per un migliorefunzionamento, bene utilizzare solo:

    Caratteri alfanumerici Per inserire spazi tra le parole, usare il simbolo underscore ( _ )

    E nient'altro. E' bene quindi evitare altri simboli ( ? , . ` ' " @ + * ecc.), utilizzare ilcarattere di spaziatura o anche il semplice trattino ( - ).Questo ultimo simbolo, merita un approfondimento a parte. Se ci trovassimo di fronte a un campodal nome:

    voti-totali

    Per estrarlo, magari dalla tabella "voti", dovremmo fare:

    SELECT `voti-totali` FROM voti

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    25/40

    Questo perch la presenza del trattino ( - ) ci impone l'utilizzo del simbolo ` per raggruppare ilnome del campo (o della tabella).

    Migliorare la leggibilit delle query

    Una pratica che seguo da molto tempo per migliorare la leggibilit delle query SQL (con MySQL oaltri database) quella di utilizzare i comandi in maiuscolo e i nomi dei campi in minuscolo. Questomi molto utile quando devo scrivere query pi strutturate, ad esempio:

    SELECT * FROM fornitori WHERE id_prodotto IN (SELECT id_prodotto FROM prodotti_speditiAS o, mezzo_di_trasporto AS s WHERE s.mezzo_di_trasporto LIKE 'gomma%' ANDs.mezzo_di_trasporto=o.mezzo_usato)

    Casi particolari: gli escapeEsistono casi in cui necessario applicare gli escape ad alcuni caratteri. Ammettiamo di volerrealizzare una query simile:

    SELECT * FROM nomeTabella WHERE titolo = 'L'utilit di MySQL';

    In questo caso, avremo un errore perch non possibile usare l'apice sigolo ( ' ) quando abbiamo giusato gli apostrofi come delimitatori del valore del campo. E' necessario quindi applicare l'escape alcarattere apostrofo, come segue:

    SELECT * FROM nomeTabella WHERE titolo = 'L\'utilit di MySQL';

    Un altro carattere che va obbligatoriamente sottoposto a escape la backslash ( \ ). Come segue:

    INSERT INTO nomeTabella VALUES('La backslash (\\) va sottoposta a escape con il segno \\');

    Funzioni automatiche per gli escapeSpesso MySQL viene utilizzato nel Web associato ad un linguaggio di sviluppo, come PHP, oppurea una tecnologia lato server come ASP.Per effettuare gli escape dei caratteri quindi, si possono usare funzioni predefinite:

    PHPCon PHP possibile sfruttare alcune funzioni predefinite, come ad esempio:

    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 istruzioneSQL, tenendo conto dell'attuale set di caratteri della connessione (presente dalla versione4.3.0 di PHP).

    PHP comunque, ha molte altre funzioni dedicate a MySQL, disponibili nella documentazioneufficiale.

    ASP

    Le ASPnon prevedono funzioni gi realizzate ma sarebbe utile farsene una.

    Ad esempio qualcosa tipo:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    26/40

    Function PerSQL(info)

    PerSQL = Replace(Replace(info,"\","\\"),"'","\'")End Function

    Come ricavare l'ultimo recordAltri database per non supportano il TOP, come ad esempio MySQL. In questo caso, necessariousare la propriet LIMIT, gi vista all'interno del Magazine nell'articolo La paginazione in MySQL.

    Il funzionamento molto simile ai database Microsoft:

    SELECT * FROM NomeTabella O

    Estrarre record casuali da MySQL e SQL Server

    MySQLe SQL Server estraggono record casuali con sintassi differenti ma simili. Vediamo primacon MySQL

    SELECT * FROM tabella ORDER

    In questo modo, estrarremo un solo record a caso. Per cambiare, sufficiente modificare LIMIT 1con i record che si vogliono estrarre (ad esempio LIMIT 3 ne estrae tre, oppure LIMIT 5,6 ne estraesei partendo dal quinto).

    Inserire una nuova rigaPer aggiungere una riga all'interno di una tabella in MySQL, si utilizza il termine INSERT.

    Ammettiamo ora di voler aggiungere una nuova voce all'interno della tabella clienti:

    INSERT INTO clienti(id,nome,descrizione,citta,ordini) VALUES('102','WebMilanoEnterprise','Web agency','Milano','1')

    In questo modo, abbiamo inserito i nuovi valori specificati tra le parentesi del termine VALUESall'interno della tabella clienti (INSERT INTO), i cui campi sono specificati anch'essi tra parentesitonde.

    Se dovessimo inserire tutti i valori nella nuova riga, possiamo anche omettere i vari campiall'interno della tabella. Ad esempio:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    27/40

    INSERT INTO clienti VALUES('102','WebMilano Enterprise','Web agency','Milano','1')

    I campi che possono essere lasciati vuoti (perch auto incrementali, null ecc.) possono anche nonessere inseriti all'interno della query.Ammettiamo che "id" sia un campo incrementale e che "ordini" abbia come valore predefinito 1.

    Possiamo evitare di specificarli, ad esempio:

    INSERT INTO clienti(nome,descrizione,citta) VALUES('WebMilano Enterprise','Webagency','Milano')

    Durante l'operazione di inserimento, dobbiamo fare attenzione che a ogni campo specificato tra leparentesi tonde all'interno della tabella, sia associato un valore interno a VALUES. Se ad esempioinserissimo per errore pi valori all'interno di VALUES rispetto a quanti ne avessimo specificatidopo INTO nomeTabella, MySQL ci risponderebbe con un errore simile:

    ERROR 1136 - Column count doesn't match value count at rowN

    DoveN la riga dell'errore.

    In questo caso, significa appunto che nel campo VALUES abbiamo specificato pi valori di quantopossibile.

    Lo stesso errore ci verrebbe restituito se facessimo il caso opposto, ovvero mancasse l'inserimentodi qualche campo specificato nella query.

    Effettuare inserimenti multipli con MySQLQuando dobbiamo inserire pi righe all'interno di una sola tabella, a rigor di logica dovremmo usaretante istruzioni INSERT INTO quante sono le nuova righe. MySQL invece, consente gli inserimentimultipli con una sola istruzione INSERT INTO, ad esempio:

    INSERT INTO clienti(nome,descrizione,citta)VALUES('WebMilano.NET','WebAgency','Milano'),VALUES('Latte & tipici','Casearia','Modena'),VALUES('Auto e occasioni','Concessionaria','Palermo')

    Ogni VALUES va separato dall'altro con una virgola ( , )

    Nessuno ci vieta comunque di usare pi INSERT INTO, ad esempio:

    INSERT INTO clienti(nome,descrizione,citta) VALUES('WebMilano.NET','WebAgency','Milano')INSERT INTO clienti(nome,descrizione,citta) VALUES('Latte & tipici','Casearia','Modena')INSERT INTO clienti(nome,descrizione,citta) VALUES('Auto eoccasioni','Concessionaria','Milano')

    Anche se con pi INSERT INTO avremo un calo di prestazioni e soprattutto uno spreco di codiceinutile.

    Modificare una rigaLa modifica delle righe di una tabella MySQL avviene attraverso il termine UPDATE.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    28/40

    Modificare una sola rigaIl codice :

    UPDATE nomeTabella SET nomeCampo = 'nuovoValore' WHERE id = 'n';

    Dove "n" identifica il campo id univoco (di tipo INT e AUTO_INCREMENT) da modificare.

    Modificare pi righeLa 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 irecords 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. Sarnecessario 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;

    Modificare tutte le righePer modificare tutte le righe di una tabella, si pu prendere la query precedente e omettere laclausola WHERE:

    UPDATE nomeTabella SET nomeCampo = 'nuovoValore';

    Modificare i valori con operatori matematiciCome abbiamo gi visto nella puntata dedicata agli operatori matematici, nel caso in cui avessimoun campo numerico, possiamo modificarlo al volo, senza bisogno di estrarlo e operarci poi sopracon un linguaggio server side come PHP.

    Ad esempio, per aggiungere una unit a un campo INT, possiamo fare:

    UPDATE nomeTabella SET nomeCampo = nomeCampo + 1;

    Per raddoppiare il campo, potremmo fare:

    UPDATE nomeTabella SET nomeCampo = nomeCampo * 2;

    Passare da Access a MySQLQualche giorno fa mi sono ritrovato nella necessit di trasportare tre tabelle da Access a MySQL, in

    pratica si trattava di un database da poco pi di un MB (oltre cento records nella tabella pipopolosa) e mi sono interessato all'argomento, leggendomi le esperienze di altri utenti e articoli adhoc.

    Avevo sottomano un portatile e dovevo fare il lavoro il prima possibile. Cos ho dovuto scartare lapossibilit di utilizzare i driver MyODBC o salvare i dati in formato .csv per poi accedere

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    29/40

    direttamente a MySQL.

    Cos mi sono messo a cercare in Rete un software creato apposta e ho trovato un ottimo prodotto, ilcui nome tutto un programma: Access to MySQL, disponibile all'indirizzo www.convert-in.com/acc2sql.htm .

    Il convertitore lavora bene anche con diverse versioni di MySQL e supporta due diverse opzioni: laconnessione diretta a MySQL e la creazione di un file cosidetto di DUMP, il quale consente diricreare 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 lacreazione delle tabelle con la stessa struttura presente in Access. Si occupa anche di popolare letabelle con i records trovati. Il file di DUMP poi, possibile riutilizzarlo in qualunque software pergestire MySQL da remoto, anche PhpMyAdmin.

    Nel mio caso specifico, ho usato la versione demo di Access to MySQL, la quale consente diricreare 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 leistruzioni 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 sceltoprima la creazione del file di DUMP:

    Poi ho scelto le opzioni offerte dal software: il database MySQLusato (nel mio caso 3.23.6 osuperiori e MS Windows).

    Come si pu vedere dall'immagine successiva, si pu scegliere tra MySQLnelle versioni inferiori osuperiori 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 acapo, con i due OS).

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    30/40

    E ancora, ho selezionato "Add lock for write around 'INSERT' statements" e "Insert 'CREATETABLE' statements", entrambi utili nel mio caso specifico.

    Se ci interessasse, potremmo anche selezionare la possibilit di creare un nuovo database all'internodi MySQLoppure 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 delfile .mdb e la directory dove salvare il file .sql contenente il file di DUMP. In questo caso, se ildatabase Access protetto da password, possibile specificare la parola chiave:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    31/40

    Se si cliccasse sulla voce "Convert table definitions only", Access To MySQL creerebbe il file diDUMP 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 suMySQL. Selezionamo quelle che ci interessano e passiamo avanti:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    32/40

    L'ultima finestra ci avviser di aver terminato il lavoro. Ora possiamo aprire il file .sql che abbiamosalvato nel terzo passaggio. Il codice interno SQL, per fare un esempio, abbiamo convertito unasemplice 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 MySQLcon i comandi del file di DUMP. DaPhpMyAdmin possibile effettuarla attraverso l'apposita textarea copiando e incollando il codiceSQL. Se il file troppo lungo, possiamo sfruttare la possibilit di effettuare query da un file di testo,attraverso l'apposito comando sfoglia:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    33/40

    l sofware di gestione di MySQLda remoto (in questo caso PhpMyAdmin) una volta portata a terminela query (pu volerci qualche secondo se il file di DUMP molto lungo) ci avviser dell'esitofinale. Nel mio caso stato positivo, e ho cos potuto concentrarmi sull'inserimento dei recordsmancanti. Ricordo infatti che Access to MySQL demo importa solo 5 records.

    Nota: chi vuole, pu comunque comprarsi la versione definitiva del software di conversione, chenella 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 m ag g io r i i n fo rm az io n i

    Riprendendo il filo del discorso, mi sono creato un file .asp che interrogasse il database Access erestituisse la sintassi SQL e quindi il file di DUMP. Ecco cosa ho scritto:

    Una volta ottenuto il codice, ho visualizzato l'HTMLe mi sono salvato il codice prodotto. Poi hoaperto PhpMyAdminalla 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.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    34/40

    La paginazione dei dati con MySQL e le ASPQuando si estrapolano informazioni da un database, si ha spesso la necessit di paginarli, ovveroestrarne un po' alla volta e permetterne poi la navigazione degli altri attraverso l'utilizzo delle

    pagine seguenti e poi precedenti.E' una pratica diffusissima nel Web, ma anche quando si lavora con grandi quantit di dati al difuori dal WWW. Pe revitare tempi di attesa troppo lunghi, si pu infatti eseguire la cosidetta

    paginazione.

    MySQLsupporta la paginazione dei dati attraverso l'istruzione LIMIT, che limita appuntol'estrapolazione di dati. Una query simile:

    SELECT * FROM dati LIMIT 1,5

    Specifica a MySQLdi prendere i records dal primo al quinto all'interno della tabella dati. I due valoriche seguono l'istruzione LIMIT, indicano da quale record iniziare a prendere i dati e quantiprenderne (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 10Abbiamo visto che l'istruzione LIMIT circoscrive la quantit di informazioni da ricavare daldatabase. 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 ognipagina deve corrispondere il record iniziale e finale dell'estrazione, fermandosi quando i recordssaranno terminati.

    Otteniamo il totale di recordsPrima di iniziare la paginazione vera e propria, necessario estrapolare il dato totale di records, cos

    da evitare di paginare dati quando i records saranno finiti. La query :

    SELECT COUNT(*) AS totale FROM NomeTabella

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    35/40

    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 paginazioneCon la query di prima, avevamo ricavato il totale di record estratti. Ora possiamo calcolarcidinamicamente i vari valori di LIMIT. Attraverso queste semplici istruzioni:

    dim paginapagina = Cint(request.querystring("pag"))if pagina 0 ThenNumPagine = Cint(NumPagine+1)

    Else

    NumPagine = Cint(NumPagine)End If

    adoRstCount.CloseSet 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 queryCon le variabili ottenute, ora sufficiente ricostruire la query dinamica. Apriamo quindi una nuova

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    36/40

    connessione al database ed estrapoliamo i dati:

    SQL = "SELECT * FROM NomeTabella LIMIT " & inizio & ", " & PageSize

    Set adoRst=adoCon.Execute(SQL)

    if totali > 0 then

    Response.write("Sono stati trovati " & totali & " records

    ")

    for i=1 to PageSizeif adoRst.eoftrue and adoRst.boftrue then

    ' qui inseriamo i dati che vogliamo stampare a video

    adoRst.movenext

    end if

    next

    ElseResponse.write("Nessun record trovato")

    end if

    If totali > PageSize AND NumPagine > pagina thenResponse.write("Pagina successiva
    ")

    End If

    If pagina > 1 thenResponse.write("
    Pagina precedente")

    End If

    adoRst.closeSet adoRst=Nothing

    ConclusioniAbbiamo visto come paginare i dati con un database MySQL. Riassumendo, il codice si compone ditre 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 dati3. Eseguiamo l'ultima query con le variabili precedentemente ottenute

    Le regular expressions con MySQLMySQL supporta l'utilizzo delle Regular Expressions (o espressioni regolari) all'interno delle query.

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    37/40

    Per utilizzarle, un esempio di sintassi pu essere la seguente:

    SELECT * FROM nomeTabella WHERE nomeCampo REGEXP "pattern";

    Il pattern include le istruzioni per verificare la regular expression. Sono tanti i caratteri speciali

    ammessi nell'espressione regolare. Partiamo da un esempio pratico per analizzarli tutti.Ammettiamo di voler cercare tutti quei campi i cui valori iniziano con la lettera "r" e finiscano conla lettera "o". Faremo:

    SELECT * FROM nomeTabella WHERE nomeCampo REGEXP "^r.+o$";

    Vediamo cosa significano i simboli usati nella query appena vista:

    ^ che inizia con il carattere successivo . cerca ogni tipo di carattere (anche ritorni a capo) + che siano presenti una o pi volte $ che termini con il carattere precedente

    In questo modo, i risultati precedenti comprenderanno valori come:

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

    Altri caratteri specialiLe regular expressions con MySQL supportano comunque altri caratteri speciali. Vediamoli tutti,anche quelli appena analizzati, qui di seguito:

    ^ che iniziano con il carattere successivo $ che finiscano con il carattere precedente . cerca ogni carattere

    * il carattere precedente dovr essere presente 0 (zero) o pi volte + il carattere precedente dovr essere presente 1 (una) o pi volte ? il carattere precedente dovr essere presente 0 (zero) o 1 (una) volta questo|altro cerca la stringa "questo" oppure (OR) la stringa "altro" (parola)* cerca 0 (zero) o pi istanze della stringa "parola" a{3,5} il carattere precedente alla { (parentesi graffa), in questo caso "a", dovr essere

    presente almeno 3 volte, ma non pi di 5 volte [b-eFl] cerca una stringa che contenga le lettere dalla "b" alla "e" (b c d e), e anche la lettera

    "F" e la lettera "l" [^b-eFl] cerca una stringa che NON contenga le lettere dalla "b" alla "e" (b c d e), e anche la

    lettera "F" e la lettera "l" "[[:stringa:]] cerca il termine "stringa", preceduto o seguito da qualunque carattere ("questa

    una megastringa MySQL" sarebbe accettato)

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    38/40

    [[::]] cerca il termine "stringa" che sia una parola a s stante (ovvero separatada 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).

    Vediamo qualche esempio pratico:

    SELECT "prova" REGEXP "[a-z]";

    Restituisce 1 (vero).

    SELECT "02800111222" REGEXP "^[0-9]{1,}[0-9]$";

    Restituisce 1, ma anche:

    SELECT "02800111222" REGEXP "^[0-9]+[0-9]$";

    Restituisce 1. Il simbolo + infatti, significa presente una o pi volte. I simboli {1,} significanoappunto presente almeno 1 (una) volta, e il massimo di volte non indicato (quindi una o pi volte)

    Eseguire query Full textLe query Full Text consentono di eseguire ricerche ad alta precisione all'interno di un database. E'

    possibile sfruttarle solo dalla versione 3.23.23 di MySQL e solo con tabelle di tipo MyISAM ecampi CHAR, VARCHAR, o TEXT.Per eseguire una query Full text su MySQL, necessario creare un indice che riunisca i vari campiche vanno sfruttati nella query.Per fare ci, sufficiente aggiungere un INDEX di tipo FULLTEXT a tali campi. Su una tabella gi

    esistente, possiamo fare:

    ALTER TABLE nomeTabella ADD FULLTEXT (primoCampo,secondoCampo,terzoCampo,...);

    Se invece dovessimo creare una nuova tabella, allora nel momento in cui andiamo a specificare ivari campi, possiamo aggiungere il FULLTEXT, ad esempio:

    CREATE TABLE nomeTabella (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,titolo VARCHAR(200),testo TEXT,

    FULLTEXT (titolo,testo));

    Una volta aggiunto l'indice FULLTEXT, possiamo iniziare a eseguire le nostre query. Ammettiamodi voler cercare la parola MySQL all'interno dei campi "titolo" e "testo" (della tabella "notizie") eordinare i risultati secondo l'attinenza della parola ricercata nei due campi. Ecco come fare:

    SELECT titolo,descrizione, MATCH(titolo,testo) AGAINST('mysql') AS attinenza FROM notizieWHERE MATCH(titolo,testo) AGAINST('mysql') ORDER BY attinenza DESC

    Cos otterremo i due campi titolo e descrizione che all'interno di titolo e testo avranno la parolamysql, ordinati secondo l'attinenza data da MySQL. Ecco come potrebbe essere il risultato dellaquery precedente:

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    39/40

    titolo descrizione attinenza

    Rilasciato MySQL 4.0.16 Il database Open Source pi utilizzato siaggiorna

    7.212370387556

    Disponibile MySQL 4.0.15 Nuova versione di bug fix di uno dei DBMS piusati al mondo

    7.0089304929524

    MySQL disponibile su IBMeServer zSeries

    Il database open Source ora configurabileanche su IBM eServer zSeries con Linuxinstallato

    6.1195414142892

    MySQL ora pi potente Una nuova e importante caratteristica diMySQL il pieno supporto delle transazioni perapplicativi di e-commerce

    5.233245521266

    Rilasciato MySQL 4.0.11 Disponibile per il download la nuova versione

    del popolare database

    4.86869959964

    Vulnerabilit nel databaseMySQL

    Grave problema di sicurezza all'interno del piutilizzato database open source

    3.8611711513829

    Rilasciato phpMyAdmin 2.5.4 Il programma che interagisce con il databaseMySQL si aggiorna

    3.6027420458677

    Rilasciato JMyAdmin 0.7 Il team di sviluppo di JMyAdmin, il sistemaweb based di gestione di MySql open sourceitaliano, ha rilasciato la nuova versione

    3.4924819304996

    Nuova falla di sicurezza in

    Phpbb

    Uno dei pi apprezzati forum Open Source

    soffre di una delicata vulnerabilit

    2.4627044551326

    Rilasciato YaBB SE 1.5.2: siconsiglia l'aggiornamentoimmediato

    Uno dei pi apprezzati Forum per siti Web, siaggiorna e ripara a diverse falle di sicurezza

    2.254412718088

    Questo sistema di query Full text pu esserci molto utile se volessimo ordinare i risultati di unaricerca in base alla rilevanza di una parola, proprio come fanno i motori di ricerca pi blasonati, cheordinano le varie pagine trovate in base a degli algoritmi propri.

    Pi nello specifico: query Full Text meglio definiteMySQL 4.0.1 e successivi in grado di scendere ancora pi nello specifico ed effettuare dellericerche con gli operatori logici che utilizzano i motori di ricerca. Torniamo alla sintassi SQL di

    prima e ammettiamo di voler cercare solo quei records che contengono la parola MySQL ma nonPhpMyAdmin. Ecco come si pu fare:

    SELECT titolo,descrizione, MATCH(titolo,testo) AGAINST('+mysql -phpmyadmin' INBOOLEAN MODE) AS attinenza FROM notizie WHERE MATCH(titolo,testo)AGAINST('+mysql -phpmyadmin' IN BOOLEAN MODE) ORDER BY attinenza DESC

    Vediamo ora tutti i casi e gli operatori utili nelle ricerche FullText:

    mysql phpmyadmin:Trova uno dei termini nei campi specificati

  • 7/24/2019 (eBook - Ita) - Informatica - Manuale Base Mysql

    40/40

    +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