Movimento 5 Stelle
 

MySQL

5. Prime query

UPDATE

La query UPDATE viene utilizzata per aggiornare i dati dei record già inseriti.
Come avviene con la SELECT è possibile applicare una condizione attraverso la clausola WHERE per aggiornare solo i record che vogliamo.

La sintassi corretta prevede l'utilizzo della parola chiave UPDATE seguita dal nome della tabella da aggiornare.
Poi segue SET che indica la lista dei campi coi rispettivi valori, separando un campo da un altro attraverso la virgola.
Vediamo prima un UPDATE senza WHERE.

UPDATE `utenti` SET `nome` = 'Mario', cognome = 'Rossi';

La query soprastante aggiorna tutti i record della tabella assegnando a tutti i campi "nome" il valore 'Mario' e a tutti i campi "cognome" il valore 'Rossi'.

Se volessimo aggiornare solo l'utente il cui ID univoco (chiave primaria) è 5, procederemmo attraverso il WHERE come mostrato nell'esempio seguente:

UPDATE `utenti` SET `nome` = 'Mario', cognome = 'Rossi'
WHERE `id` = 5;

Anche in questo caso possiamo strutturare il WHERE in condizioni più complesse, servendoci degli operatori AND e OR.

DELETE

La query DELETE viene utilizzata per eliminare i record da una tabella.

E' molto simile all'UPDATE, senza la parte riguardante i campi, specificando quindi solo la tabella da cui cancellare e il WHERE per eliminare solo i record desiderati.

Vediamo un esempio:

DELETE FROM `utenti` WHERE `id` = 5;

La query appena vista elimina tutti i record della tabella "utenti" il cui campo id contiene il valore 5.
In questo caso, essendo id una chiave primaria, verrà eliminato un solo utente.

Nota bene: per eliminare tutti i record di una tabella consiglio l'utilizzo della query TRUNCATE che libererà anche lo spazio rimasto inutilizzato e ripristinerà l'eventuale conteggio dei campi auto increment.

TRUNCATE TABLE `utenti`;

4. Prime query

In questo capitolo inizieremo a vedere le prime query MySQL.
La query è il cuore di questo linguaggio, e consiste in una interrogazione al database. Noi interroghiamo il database con una query ed esso ci risponderà con un set di risorse che, come vedremo, varieranno a seconda del tipo di query che sottoporremo al linguaggio.

In questo capitolo analizzeremo brevemente i quattro tipi principali di query di cui disponiamo:

  • INSERT - Questa query viene utilizzata per inserire record in una tabella, popolandola.
  • SELECT - E' la query più comune, viene utilizzata per leggere i record di una tabella. E' possibile applicare alla SELECT una condizione in modo da poter prelevare solo i record che ci interessano, come ad esempio tutti gli utenti di sesso maschile o tutti gli utenti di sesso femminile.
  • UPDATE - Come per la SELECT, anche l'UPDATE supporta una condizione per poter agire solo sui record che ci interessano. L'UPDATE viene utilizzata per modificare record già esistenti.
  • DELETE - Come è chiaro dal suo nome, la DELETE viene usata per eliminare i record da una tabella. E' possibile applicare una condizione per eliminare solo i record che vogliamo.

INSERT

La prima query che vediamo da vicino è la INSERT.
La sintassi è molto semplice. La query inizia con la clausola INSERT INTO seguita dal nome della tabella, i campi in cui vogliamo scrivere (opzionale), la clausola VALUES e poi i valori per i suddetti campi.

INSERT INTO `utenti`
(`nome`, `cognome`, `email`, `sesso`)
VALUES
('Mario', 'Rossi', 'mario.rossi@nomail.com', 'M');

La query termina con un punto e virgola.
L'apice che utilizzo per delimitare il nome della tabella e dei campi non è obbligatorio ma è comunque più corretto. Per scriverlo lasciate premuto ALT e digitate 96 sul tastierino numerico.

Come potete notare ho utilizzato come tabella di esempio, la tabella "utenti" dei capitoli 3 e 4, omettendo però il campo `id_utente`.
Questo perchè durante la creazione della tabella in esame, specificammo come attributo del campo AUTO_INCREMENT, MySQL quindi assegnerà automaticamente un valore progressivo a questo campo ad ogni inserimento.

MySQL vi consente comunque di specificare un valore per questo campo, e se invece volete metterlo nella lista dei campi ma dire a MySQL di auto incrementarlo, allora nei VALUES specificate il valore speciale NULL per il campo `id_utente`.

E' possibile anche omettere la lista dei campi, ma in questo caso sarà obbligatorio specificarli tutti come nell'esempio seguente:

INSERT INTO `utenti`
VALUES
(NULL, 'Mario', 'Rossi', 'mario.rossi@nomail.com', 'M');

Per eseguire il codice MySQL potete utilizzare tranquillamente phpMyAdmin come mostrato in questa schermata.

SELECT

Come abbiamo detto prima la SELECT viene usata per leggere record da una tabella. Vediamo di seguito la sua forma più semplice.

SELECT * FROM `utenti`;

L'asterisco sta per "tutti i campi", ed indica quindi che vogliamo leggere i record per intero.
Questa query ci restituirà il contenuto dell'intera tabella specificata.
E' possibile anche specificare quali campi vogliamo al posto dell'asterisco, vediamo quindi di seguito una query equivalente a quella di prima:

SELECT `id_utente`, `nome`, `cognome`, `email`, `sesso`
FROM `utenti`;

Come potete notare la query inizia con la clausola SELECT, continua con la lista dei campi che vogliamo prelevare dalla tabella, poi la clausola FROM seguita dal nome della tabella da cui vogliamo prelevare i dati.

Se quindi volessimo solamente il nome e il cognome di tutti gli utenti, scriveremmo una query del genere:

SELECT `nome`, `cognome` FROM `utenti`;

Come accennato all'inizio del capitolo, è possibile specificare anche una condizione alla SELECT, e lo faremo attraverso la clausola WHERE.

Attraverso il WHERE potremo specificare quali valori desideriamo (o non desideriamo) per un determinato campo, un pò come si fa nelle IF degli altri linguaggi di programmazione, con qualche differenza nella sintassi.

Nel prossimo esempio vedremo come leggere tutti gli utenti della tabella di sesso maschile.

SELECT * FROM `utenti`
WHERE `sesso` = 'M';

Ancora un altro esempio in cui leggiamo gli utenti di sesso maschile che si chiamano 'Mario'.

SELECT * FROM `utenti`
WHERE `sesso` = 'M' AND `nome` = 'Mario';

Se invece volessimo gli utenti che sono di sesso maschile oppure di nome 'Luca', utilizzeremo la clausola OR invece dell'AND.

SELECT * FROM `utenti`
WHERE `sesso` = 'M' OR `nome` = 'Luca';

Le SELECT diventeranno molto più complesse di queste grazie a query annidate, join e molto altro, leggendo da più tabelle contemporaneamente e così via, ma per il momento non ci interessa approfondire, ma bensì dare un'occhiata generale a tutto il mondo MySQL per passare poi ad argomenti più complessi.

Nel prossimo capitolo vedremo le query UPDATE e DELETE.

3. Tipi di dato comuni

In questo capitolo vedremo i tipi di dato più comuni che MySQL ci fornisce per creare della applicazioni basiche. Nei capitoli successivi disporrete di una reference completa, inutile ora che stiamo cercando di imparare le basi che ci consentiranno poi di padroneggiare il linguaggio.

Di seguito una lista dei tipi più comuni:

  • VARCHAR
  • CHAR
  • TEXT e derivati
  • INT e derivati
  • FLOAT, DOUBLE e DECIMAL
  • BOOL
  • ENUM
  • DATE
  • DATETIME

VARCHAR serve a memorizzare stringhe di lunghezza variabile di cui non conosciamo a priori la lunghezza, come ad esempio il cognome di un utente.
Questo tipo di dato può ospitare da 1 a 255 byte quindi una stringa da 1 ad un massimo di 255 caratteri.

CHAR ci consente di memorizzare stringhe (o un solo carattere) di lunghezza fissa. Utile per memorizzare il codice fiscale oppure una Partita IVA di cui conosciamo già l'esatta lunghezza.

TEXT ci servirà per salvare stringhe molto più lunghe della capienza di un semplice VARCHAR, come ad esempio il testo di una news.
Vediamo di seguito TEXT e le sue utili varianti:

  • TINYTEXT - 255 byte
  • TEXT - 65.535 byte (64KB)
  • MEDIUMTEXT - 16.777.215 byte (16MB)
  • LONGTEXT - 4.294.967.295 byte (4GB)

INT memorizza numeri interi. Vediamo velocemente le sue specifiche:

  • TINYINT da -128 a 127 (UNSIGNED da 0 a 255)
  • SMALLINT da -32768 a 32767 (UNSIGNED da 0 a 65535)
  • MEDIUMINT da -8388608 a 8388607 (UNSIGNED da 0 a 16777215)
  • INT da -2147483648 a 2147483647 (UNSIGNED da 0 a 4294967295)
  • BIGINT - da -9223372036854775808 a 9223372036854775807 (UNSIGNED da 0 a 18446744073709551615)

I tipi FLOAT, DOUBLE e DECIMAL vengono usati per memorizzare numeri in virgola mobile.
Innanzitutto quando dichiariamo un campo di questo tipo, MySQL ci consente di specificare due parametri, il primo per la dimensione del dato, il secondo per la precisione di quest ultimo.

Se quindi dichiarassimo un FLOAT(5,2) potremmo rappresentare un numero in virgola del genere: 999,99.
La differenza fra FLOAT e DOUBLE sta nel numero di byte massimo riservati alla precisione del numero. Quattro per il FLOAT e otto per il DOUBLE.

Il tipo DECIMAL invece viene utilizzato per specificare con esattezza lo spazio riservato alla memorizzazione e per assicurarsi che venga mantenuta l'esatta precisione del dato, utile per memorizzare dati monetari.

Un DECIMAL(5,2) ci consentirà di gestire dati da -999,99 a 999,99.

Il tipo BOOL ci consente di gestire dati di tipo booleano ossia un campo che possa assumere solo i valori true e false.
Nella versione MySQL 5.1, questo tipo di dato non è supportato a livello nativo, e sarà introdotto in una versione successiva.
Attualmente il tipo BOOL non è altro che un alias del tipo TINYINT(1). Vi troverete quindi a leggere un semplice numero intero, considerando lo 0 come false e il numero 1 come true.

Il tipo ENUM, invece, ci consente di impostare a priori un set di valori predefinito che un dato può assumere. Qualunque valore proposto che non è incluso nel nostro insieme predefinito, genererà un errore.
ENUM ci tornerà quindi molto utile con campi che potranno assumere un'insieme di valori non molto grande che conosciamo già, come ad esempio il sesso di una persona.

Potremmo quindi modificare la tabella "utenti" del capitolo 3 aggiungendo il campo "sesso" di tipo ENUM, specificando i valori che potrà assumere attraverso la stessa query di modifica.

ALTER TABLE `utenti`
ADD `sesso` ENUM('M','F') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL

In questo modo MySQL sa che il campo sesso potrà assumere solo i valori M o F e agirà di conseguenza.
Vedremo più avanti come sfruttare questa particolarità a nostro vantaggio quando andremo a parlare di performance MySQL.

Vediamo infine gli ultimi due tipi di questo capitolo.
DATE e DATETIME utilizzati rispettivamente per memorizzata una data oppure data e ora.

Con DATE possiamo memorizzare tutte le date (giorno, mese e anno) che vanno dal primo gennaio 1000 (1000-01-01) fino al 31 dicembre 9999 (9999-12-31). Con DATETIME possiamo memorizzare le stesse date di DATE ma potremo tenere traccia anche dell'orario.

La data verrà espressa in questo formato YYYY-MM-DD, mentre l'orario sarà il classico HH:MM:SS.

2. Tabelle e record

Un database è formato da zero o più tabelle ed una tabella è formata da zero o più record.
La tabella viene descritta da uno o più campi ripetuti per tutti i record come in tutte le tradizionali tabelle.

Per rendere il concetto più chiaro, torniamo a phpMyAdmin e creiamo la tabella "utenti", come mostrato nella schermata seguente.

I campi scelti per la tabella "utenti" saranno 4:

  • id_utente
  • nome
  • cognome
  • email

Il campo id_utente sarà un numero intero che utilizzeremo per identificare in modo univoco gli utenti.
Questo perchè due utenti potrebbero avere lo stesso nome e lo stesso cognome e non potremo quindi riconoscerli in modo efficace.

Come identificativo univoco si potrebbe usare anche l'email dal momento che ad una email può corrispondere uno ed un solo utente.
Ma come vedremo più avanti, per motivi di performance delle applicazioni, come identificativo univoco è decisamente migliore un numero intero.

Questo per il semplice fatto che per un computer è molto più semplice comparare un intero piuttosto di una stringa di caratteri, e per altri motivi che affronteremo in fase di progettazione di un database.

Ma torniamo alla crezione della nostra tabella.
Una volta specificato il nome della tabella e il numero dei campi, cliccando sul tasto "Esegui", phpMyAdmin rimarrà in attesa di input creando una tabella apposita che ci consentirà di impostare la struttura vera e propria della tabella.

Riempitela come segue saltando i campi non specificati, dopodichè analizzeremo assieme le varie impostazioni:

Campo Tipo Lunghezza/Set Collation Attributi Indice A_I
id_utente INT 10   UNSIGNED PRIMARY Selezionato
nome VARCHAR 150 utf8_unicode_ci      
cognome VARCHAR 150 utf8_unicode_ci      
email VARCHAR 150 utf8_unicode_ci   UNIQUE  

Analizziamo velocemente i settaggi che abbiamo scelto per la tabella appena creata:

  • Campo - Rappresenta il nome del campo. Lo utilizzeremo ogni volta che dovremo riferirci ad esso per scrivere o leggere il valore contenuto in quel campo, che sia un intero o una stringa, di un determinato record.
  • Tipo - Indica a MySQL il tipo di dato che il campo dovrà ospitare. Nella tabella "utenti" appena creata abbiamo visto solo i tipi INT e VARCHAR che rappresentano rispettivamente un numero intero ed una stringa di lunghezza variabile. Vedremo in dettaglio i tipi di dato nel capitolo seguente.
  • Lunghezza/Set - Indica lo spazio in byte riservato alla memorizzazione del dato. Per fare un semplice esempio, creando un VARCHAR(5), MySQL ci consentirà di memorizzare in quel campo solo una stringa di lunghezza minore o uguale a cinque.
  • Collation - Collation e Character Set li abbiamo già affrontati nel capitolo "Database e siti web".
  • Attributi - Gli attributi ci consentono di specificare dei comportamenti aggiuntivi per un campo. Vediamo i principali:
    UNSIGNED indica che il campo non ammette numeri negativi. Di default i campi numerici sono SIGNED quindi un INT(1) accetta valori da -128 a 127 mentre un UNSIGNED INT(1) accetta valori da 0 a 255.
    Un altro attributo comune è ZEROFILL applicabile solo agli UNSIGNED (se specificate solo ZEROFILL MySQL considererà comunque il campo anche UNSIGNED).
    ZEROFILL indica che il valore del campo deve essere riempito di zeri per i byte mancanti. Esempio: se in un INT(2) ZEROFILL inseriamo il valore 1 esso verrà visualizzato come 01.
    Utile per memorizzare giorni e mesi o ancora codici di avviamento postale o ABI e CAB bancari.
  • Indice - Esistono vari tipi di indici e modi in cui MySQL li gestisce. Prima di arrivare al capitolo apposito in cui approfondiremo meglio l'argomento, diamo un'occhiata veloce agli indici PRIMARY e UNIQUE.
    PRIMARY serve a definire la chiave primaria della tabella, ossia dichiariamo esplicitamente a MySQL che quel campo rappresenta la chiave univoca per identificare tutti i record di quella tabella e che non sono quindi ammessi record con lo stesso valore per quel campo.
    Come vedremo più avanti, gli indici possono essere definiti su uno o più campi, ma non è questo il nostro caso.
    Anche UNIQUE definisce che non sono ammessi record con lo stesso valore per quel campo.
    Vedremo meglio la differenza fra i due tipi di indice quando andremo a vedere come lavorano i motori di memorizzazione e il modo con cui MySQL consente loro di gestire la memoria.
  • A_I - A_I sta per Auto Increment. Questa opzione ci consente di dire a MySQL che deve assegnare automaticamente un valore al campo qualora non venisse esplicitamente specificato, fornendo come valore un numero intero progressivo.
    Man mano che inseriremo record nella tabella quindi, essi avranno il valore del record precedente + 1.

La tabella appena proposta è senza dubbio incompleta e discutibile, ma ottima per iniziare a capire come può essere semplice e alla portata organizzare una tabella per memorizzare i nostri utenti o qualunque altro dato.

Ma andiamo avanti per vedere i tipi di dato che MySQL ci offre per gestire dati più complessi in modo da poter scrivere poi le nostre prime query MySQL.

Per chi volesse iniziare a vedere la query MySQL per la creazione della tabella "utenti", ne riporto di seguito il codice:

CREATE TABLE `utenti`
(
	`id_utente` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
	`nome` VARCHAR(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
	`cognome` VARCHAR(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
	`email` VARCHAR(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
	UNIQUE (`email`)
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci;

1. Database e siti web

MySQL è attualmente il linguaggio più utilizzato per gestire i database su siti web e applicazioni orientate al web.

Questo è dovuto al fatto che viene distribuito sotto licenza GNU GPL e al fatto che sia molto semplice da gestire.

Ma veniamo al sodo ...
Un database non è altro che una collezione di dati organizzata in una o più tabelle come vedremo più avanti.
Questo significa che potremo aggiungere al nostro sito una memoria "permanente" che ci permetterà di ricordare ad esempio gli utenti registrati e la loro ultima visita, avere un archivio di news e molto altro.

Per prima cosa dobbiamo creare il nostro primo database attraverso cui impareremo questo splendido linguaggio, perciò aprite il browser e accedete a phpMyAdmin.
Come si vede nella schermata che segue, digitate il nome del database che desiderate nel campo a sinistra, mentre nella select Collation sulla destra scegliete l'ultimo valore, ossia utf8_unicode_ci e cliccate su Crea.

Abbiamo appena creato un database utilizzando phpMyAdmin.
phpMyAdmin non ha fatto altro che eseguire un'istruzione MySQL al posto nostro, di conseguenza se avessimo voluto creare noi il database mediante il linguaggio MySQL, lo avremmo fatto usando il codice seguente.

CREATE DATABASE `test`;

Oppure specificando anche il Character Set e la Collation desiderati:

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

La Collation indica a MySQL le regole che dovrà utilizzare per confrontare i caratteri che andremo a inserire.
I Character Set invece, corrispondono ai set di caratteri che MySQL utilizzerà per memorizzare le stringhe.

Con la codifica UTF-8 non avremo nessun problema a memorizzare i caratteri accentati della lingua italiana nè li avremo per i kanji della lingua giapponese o per i caratteri del russo e così via.

Nel prossimo capitolo vedremo le tabelle e i record.

Imparare MySQL

Questa guida verrà strutturata a livelli in modo da servire sia i neofiti, sia gli utenti più esperti, crescendo di difficoltà nei capitoli.

Lo scopo della prima parte è quello di consentire a un neofita, anche con poche nozioni sulla programmazione, di capire cosa è un database e come utilizzarlo nell'ambito dello sviluppo dei siti web.

Condividi contenuti