- Prima di procedere con la lettura
- 0. Accedere al sistema
- 1. Creiamo un nuovo database
- 2. Creiamo una nuova tabella
- 3. Inseriamo i primi record
- 4. Il comando di selezione: SELECT
- 5. Incrociare i dati
- 6. Ordinare i dati
- 7. Aggiornare i dati
- 8. Eliminare i dati
- 9. Eliminare le tabelle
- 10. Eliminare il db
- 11. Conclusioni
Al momento è Webmaster del portale XoopsItalia.
Prima di procedere con la lettura
E' necessario che il lettore abbia almeno una infarinatura generale di cos'è e com'è strutturato un database ed in particolare si dà per scontato che si conosca:
- cos'è un database relazionale
- cos'è una tabella
- cos'è un campo e un record
- cos'è una chiave e una chiave primaria
Se non possedete le suddette conoscenze, la lettura di questo articolo vi potrebbe risultare ostica e noiosa. Le vostre lacune possono essere tranquillamente colmate con brevi ricerche sul web, oppure attendendo che abbia un po' di tempo per scrivere un articolo per utenti ancora più newbie.
Normalmente la maggiore parte dei testi che trattano SQL iniziano mostrando una panoramica dei comandi principali, elencando per primo il comando per le interrogazioni: SELECT.
Questo però non ha la pretesa di essere un testo, né ho voglia di iniziare dalla selezione. Essendo infatti una guida per newbie, ho pensato che sarebbe stato più opportuno sviluppare insieme un database di esempio partendo da 0 e imparare ad utilizzare i vari comandi mano a mano che ci si presentava l'occasione. Secondo me, “sporcarsi le mani” è l'unico modo di imparare veramente.
I comandi che vedremo sono universali (a meno di piccolissime differenze), ovvero possono essere utilizzati su qualsiasi server che accetti query SQL (MySQL, MS SQL Server,...).
In questo articolo utilizzeremo MySql 4.0.1.5 con phpMyAdmin 2.5.3; useremo il secondo solo per lanciare le nostre query SQL, quindi scordatevi di utilizzare i pulsanti con le funzioni integrate. Per lo meno all'inizio.
N.B.: negli esempi che seguono i nomi di campi e tabelle non sono racchiusi tra singoli apici (es. 'tabella'); quasi tutti i principali db server (IBM DB2, MySql,...) sono perfettamente in grado di leggere questa notazione, ma alcuni potrebbero restituire qualche errore tipo “Tabella non trovata”. In questi casi provate ad utilizzare gli apici.
MySql in particolare digerisce tranquillamente entrambe le notazioni, per cui utilizzate quella che preferite.
0. Accedere al sistema
Accedete al database server. Se state utilizzando la mia stessa configurazione basterà avviare il server MySql e posizionarsi su http://127.0.0.1/mysql/ (figura 1).

1. Creiamo un nuovo database
Per non danneggiare database già esistenti è opportuno andarne a creare uno nuovo.
In basso a sinistra troverete un link alla Finestra della query. Questo è lo strumento dal quale lanceremo tutti i nostri comandi.

a. Cliccate sul link e vi si aprirà un pannello popup.
b. Cancellate il contenuto della casella di testo
c. Inserite CREATE DATABASE test e cliccate su Esegui
Complimenti, avete creato il vostro primo db in MySql, e l'avete chiamato test. Se avete fatto tutto correttamente dovreste vedere qualcosa del genere.

2. Creiamo una nuova tabella
Ora creeremo una tabella chiamata tab_test con la seguente struttura:
| id | nome | cat |
Digitate CREATE TABLE tab_test (id int(3) NOT NULL AUTO_INCREMENT, nome varchar(20), cat int(1), PRIMARY KEY(id)) e cliccate Esegui.
Il comando è abbastanza intuitivo. Abbiamo creato la tabella specificando tra parentesi tutti i campi con le relative opzioni e restrizioni. Il campo id è stato dichiarato NOT NULL (non nullo) in quanto altrimenti non sarebbe potuto essere una chiave primaria, e l'abbiamo dichiarato AUTO_INCREMENT (autoincrementante) in modo da non dover controllare e inserire manualmente il valore della chiave. In questo modo ad ogni nuovo record inserito, il database provvederà ad assegnare il numero consecutivo. Varchar è il formato che esprime la stringa in SQL.
Se avete inserito il comando correttamente dovreste vedere qualcosa del genere.

3. Inseriamo i primi record
Ora che abbiamo la nostra prima tabella, iniziamo a popolarla.
Digitate INSERT INTO tab_test (id, nome, cat) VALUES (1, 'alessio', 1) e cliccate Esegui.
Se avete inserito il comando correttamente dovreste vedere questo.

Ora provate ad inserire altri record:
| id | nome | cat |
| 2 | marco | 1 |
| 3 | luca | 2 |
| 4 | gianni | 2 |
| 5 | gianmarco | 3 |
4. Il comando di selezione: SELECT
La tabella ora è popolata... ma ne siamo sicuri? L'unico modo per controllare e interrogare il database, e chiedere tutti i record inseriti in tab_test.
Digitate SELECT * FROM tab_test
Se avete inserito tutti i record come sopra, la query vi dovrebbe restituire questo.

E se volessimo visualizzare solo un determinato utente? O solo certi dipendenti?
In queste situazioni ci viene in aiuto la clausola WHERE, che permette di specificare delle determinate condizioni di selezione.
Nell'esempio che segue vogliamo che il sistema restituisca tutti i dipendenti di categoria 2.
a. Aprite la Finestra delle query
b. Digitate SELECT * FROM tab_test WHERE cat='2' e cliccate Esegui.

La clausola WHERE è molto potente e versatile. Oltre all'operatore di uguaglianza (=) potete tranquillamente utilizzare tutti gli operatori di confronto (>, <, >=, <=, <>).
Per esempio per ottenere tutti i dipendenti non appartenenti alla categoria 2 basterà digitare:
SELECT * FROM tab_test WHERE cat<>'2'
Potete anche specificare un determinato utente utilizzando magari la sua chiave primaria (WHERE id = '3') o potete recuperare insiemi di risultati utilizzando la parola chiave LIKE e opporturne wildcards.
| Wildcards disponibili | ||
|---|---|---|
| _ (underscore) | carattere qualsiasi | 'alessi_' restituirà 'alessia', 'alessio', ... |
| % | Stringa qualsiasi | 'mar_' restituirà 'marco', 'marta', 'mariangela', ... |
Ad esempio possiamo recuperare l'elenco dei dipendenti il cui nome inizia con 'gian' con questa semplice query:
SELECT * FROM tab_test WHERE nome LIKE 'gian_'

Se invece avete bisogno di recuperare i dipendenti mediante un intervallo di tipo numerico, potete utilizzare il comodo operatore BETWEEN:
SELECT * FROM tab_test WHERE cat BETWEEN 2 AND 4
Oppure potete specificare un insieme di valori di confronto validi. Per esempio potete ottenere lo stesso risultato dell'ultima query con quest'altra digitazione:
SELECT * FROM tab_test WHERE cat IN ('2', '3', '4')
La clausola WHERE è in grado di valutare inoltre concatenazioni logiche di condizioni, mediante i classici operatori logici (AND, OR).
5. Incrociare i dati
I database contengono da una a infinite tabelle, che possono fornire miriadi di informazioni incrociando relazionalmente i dati tra loro.
Create una seconda tabella, chiamata tab_catlist, come segue:
| id_cat int(1) PK | descr varchar(15) |
| 1 | Dirigenti |
2 | Programmatore |
| 3 | Tester |
che contiene banalmente l'elenco di categorie di dipendenti.
Una volta creata e popolata la nuova tabella, incrociamolo con tab_test.
Digitate SELECT * FROM tab_test T, tab_catlist C WHERE T.cat = C.id_cat

L'operazione di incrocio che avete appena fatto è una join implicita, in quanto avete specificato in una clausola WHERE quali campi costituivano una relazione. Abbiamo inoltre introdotto gli alias, ovvero nomi (di norma abbreviativi) da associare alle tabelle per evitare di riscrivere tutto il nome per esteso. La notazione di appartenenza di un campo ad una tabella si esprime con il punto (es. Tabella.Campo1).
Converrete con me che stilisticamente non è però bello vedere la ripetizione della colonna con il codice della categoria, per cui filtriamo i dati conservando solo il nome dell'impiegato e la sua mansione.
Digitate SELECT T.nome, C.descr FROM tab_test T, tab_catlist C WHERE T.cat = C.id_cat

Molto meglio, no?
Un altro tipo di join è quella esplicita. In questa tecnica utilizziamo la parola chiave JOIN, che ci permette di incrociare i dati senza utilizzare una clausola WHERE.
Digitate SELECT * FROM tab_test T JOIN tab_catlist C ON T.cat=C.id_cat.
Come noterete il risultato è identico.
E' possibile incrociare anche un numero maggiore di tabelle, ma non credo siano materiale opportuno per un tutorial per newbie.
6. Ordinare i dati
Quando i record restituiti sono parecchi, è opportuno dare un criterio di ordinamento, per facilitarne la lettura.
Per fare un paio di esempi, la prima query ordina tutto il contenuto della tabella per ordine alfabetico discendente (Z-A), mentre la seconda incrocia le nostre due tabelle (mediante il confronto della categoria) ordinando poi per categoria e nome.
SELECT * FROM tab_test ORDER BY nome DESC

SELECT T.nome, T.cat, C.descr FROM tab_test T, tab_catlist C WHERE T.cat = C.id_cat ORDER BY cat, nome

7. Aggiornare i dati
Una delle azioni più ricorrenti che viene eseguita sui db è l'aggiornamento dei record esistenti. Niente di più semplice: basterà indicare al sistema qual è il record da moficare (magari mediante chiave primaria), specificare il campo da aggiornare e fornire il nuovo valore.
Cosa dovremmo inserire se ad esempio il nostro impiegato Gianni cambiasse sesso trasformandosi in Gianna?
Digitate UPDATE tab_test SET nome='gianna' WHERE id='4' e cliccate Esegui.
Et voilà! Eseguite un'opportuna query per visualizzare i cambiamenti apportati.
8. Eliminare i dati
Eliminare record è un'altra azione tipica effettuata sui database.
Supponiamo ad esempio che Gianmarco si sia licenziato per passare alla concorrenza.
Digitate DELETE FROM tab_test WHERE id='5' e cliccate Esegui.
Lanciate poi una query sulla tabella per constatare l'avvenuta eliminazione del record relativo a Gianmarco.
E se invece voglio svuotare la tabella perchè ho licenziato tutti?
Digitate TRUNCATE TABLE tab_test
E puff! Tutto sparito!
9. Eliminare le tabelle
Ci stiamo avvicinando alla conclusione di questo mini-tutorial su come muovere i primi passi nei database relazionali ed è opportuno iniziare a smantellare il nostro database-palestra.
Digitate DROP TABLE tab_test
e digitate DROP TABLE tab_catlist
per eliminare le tabelle.
10. Eliminare il db
Il passo finale è eliminare il db.
Digitate DROP DATABASE test
E ci vediamo al prossimo tutorial...
11. Conclusioni
Tip di chiusura: l'interfaccia grafica di phpMyAdmin incorpora una utilissima funzione, la creazione automatica del codice php. Cliccando su tale tasto dopo aver effettuato una query, il sistema vi restituirà del codice correttamente formattato per effettuare la stessa query dal vostro script php (previo ovviamente opportuno collegamento al db). Consiglio pertanto ai newbie che vogliano sperimentare le query dai loro primi moduli di testare le interrogazioni sull'interfaccia grafica (come abbiamo visto in questo tutorial) e di farsi generare il codice da copiare & incollare negli script.
La materia SQL è stata solo introdotta, senza eccedere troppo nell'approfondimento di ogni comando. Non abbiamo parlato di join su più tabelle, di self, inner e outer join, di chiavi esterne, di null values, di operatori di insiemistica, di query ricorsive e innestate, di viste, di tabelle temporanee, ....
Quanto detto finora vi permetterà però già da ora di iniziare a guardare con occhi diversi le query inviate dai moduli al db di XOOPS, di comprendere meglio il funzionamento di tali moduli e chissà, di cominciare a sviluppare qualche modulo di test tutto vostro appoggianodovi su db.


