GUIDA BASE ALL’SQL by DaD Introduzione L'SQL, è un linguaggio per database anche se sarebbe meglio definirlo un sub-linguaggio in quanto a differenza dei linguaggi veri e propri non possiede alcun comando di controllo e quindi possiamo dire che l'sql non è un linguaggio completo. Essendo un linguaggio per la gestione dei database dispone di tutte quelle funzioni che possono risultare utili per la manipolazione dei dati in essi contenuti, dalla definizione dei dati alla modifica fino alla lettura e alla eliminazione di quest’ultimi. Da questa breve descrizione dell'sql possiamo concepire che questo linguaggio non sia di natura imperativa come la maggior parte dei linguaggi di programmazione, ma possiamo intendere come questo sia orientato alla programmazione modulare/dichiarativa, ed essendo tale non vi sono proprietà logiche ma esso viene diviso in tre sottoinsiemi: • DDL [Data Definition Language] Grazie a questo sottoinsieme saremo in grado di creare, modificare e cancellare la struttura di un database. • DML [Data Manipulation Language] E' con il DML che potremo interagire all'interno dei nostri database perchè potremo inserire, editare e eliminare i dati in esso inseriti. • DCL [Data Control Language] Serve essenzialmente per la gestione dei permessi e degli utenti. Ritorneremo più avanti sulla suddivisione dell'sql adesso però dobbiamo trovare un'applicazione in grado di poter interpretare il linguaggio sql, la scelta può ricadere semplicemente su scelte personali oppure esigenze lavorative differenti, le maggiori applicazioni disponibili sono Oracle [http://www.oracle.com] che è uno dei maggiori sistemi usati dalla grandi e medie aziende per la gestione dei loro database, essendo un'applicazione di uso commerciale il suo funzionamento non è alla portata di tutti ma è di sicuro uno dei più potenti manager in circolazione. Oltre ad Oracle ed altre applicazioni a pagamento che possono fungere da manager per l’sql vi sono anche delle alternative free ed open source come l’ormai noto MySQL[http://mysql.com/] un ottimo e potente manager che può garantire una più che buona gestione dei nostri database. MySQL è sinceramente la scelta obbligata per chi vuole iniziare sia a gestire e a lavorare sui database che ad apprendere la sintassi dell'sql, quindi personalmente io consiglio MySQL per tutti quelli che stanno appena iniziando e poi anche questa miniguida si baserà proprio sull’utilizzo di MySQL. Installazione MySQL Siccome voglio porre più attenzione per quanto riguarda il codice dell'sql per l'installazione di MySQL vi rimanderò a dei link e non seguirò personalmente l'installazione anche perchè mi sembra abbastanza facile da installare e potrebbe sembrare uno spreco di spazio spiegarlo. • Installazione MySQL su Windows • Installazione MySQL su Linux In ogni caso consiglio l'installazione di XAMPP[http://www.apachefriends.org] che installerà oltre MySQL una serie di servizi che potrebbero risultare più che utili (vedi php, apache ecc ...). Iniziamo a lavorare con MySQL Bene una volta installata il vostro manager (in questo caso credo MySQL) potremmo iniziare a lavorare con l'SQL vero e proprio. Innanzitutto rechiamoci nella cartella bin di MySQL usando il prompt dei comandi, (ossia diamo il comando “cd percorso per arrivare alla cartella bin”) dopodichè facciamo partire MySQL in questo modo; >> mysql -u [Nome Utente] -p Nota: Se non riuscite ad avviare MySQL con il vostro account (es. Pippo) digitate root al posto del vostro nome utente. Una volta inserita la password sarete all'interno di MySQL e potrete davvero iniziare a lavorare con l'SQL. Ora possiamo ritornare al discorso dei tre sottoinsiemi che avevamo accennato nell'introduzione. DDL Il DDL ha il compito di gestire un intero database ma non da la possibilità di modificare o di gestire i dati in esso contenuti, ed è qui che subentra il DML (La parte che vedremo con più attenzione dei tre sottoinsiemi), c'è da dire però che non tutti gli utenti hanno accesso ai comandi per la gestione del DDL infatti ci sarà bisogno dei permessi adeguati per gestire in completa libertà un database ed è qui che entrerà in gioco il DCL. Come avete potuto notare i tre sottoinsiemi sono strettamente concatenati l’uno all’altro e nessuno dei tre avrebbe senso di esistere senza l’esistenza dell’altro, in questa miniguida però non tratteremo della semantica del DDL se ci saranno guide successive prenderò in considerazione anche questa parte dell'SQL ma è pur vero che l'utente medio con difficoltà andrà a gestire questa parte del linguaggio quindi non esitate troppo a tralasciare questa parte se vi occorre solo una infarinatura generale su questo linguaggio. DML E’ grazie al DML che da ora in poi potremo interagire in modo dinamico con il nostro database strutturato grazie al DDL, naturalmente solo se avremo i permessi adeguati forniteci dal DCL. All'interno del DML troviamo vari comandi, di svariata natura che potranno servirci per la gestione dei nostri database, prima di vederli però, dobbiamo conoscere i tipi di operatori presenti nell'SQL che come in ogni linguaggio ne possiede molteplici. ~ Operatori di Confronto Sono i classici operatori che mettono a confronto due o più istruzioni, nell'sql di questo tipo ne troviamo molteplici. 1. = Esprime uguaglianza tra due valori numerici. 2. < Stabilisce se un valore è minore di un altro. 3. > Stabilisce se un valore è maggiore di un altro. 4. <= Stabilisce se un valore è minore o uguale di un altro. 5. >= Stabilisce se un valore è maggiore o uguale di un altro. 6. <> Stabilisce se due valori sono diversi tra loro. 7. LIKE Esprime somiglianza tra due valori letterali. 8. BETWEEN Recupera un valore compreso tra due valori. 9. IN Stabilisce se un valore è contenuto in una lista di valori possibili. 10. EXISTS Stabilisce se un determinato record esiste. ~ Operatori Aritmetici Questi operatori rendono possibili all’interno dell’sql le quattro operazioni matematiche fondamentali. 1. + Effettua un'addizione. 2. - Effettua una sottrazione. 3. * Effettua una moltiplicazione. 4. / Effettua una divisione. ~ Operatori Condizionali Nell'sql esiste solo un operatore di questo ramo ed è l'operatore WHERE che serve a definire i termini di alcune ricerche in modo più specifico e mirato. ~ Operatori Logici Esistono tre operatori logici nell'sql e servono per legare due o più istruzioni fra loro. 1. AND Restituisce tutte le condizioni per le quali le due o più condizioni espresse sono tutte vere contemporaneamente. 2. OR Restituisce tutte le condizioni per le quali le due o più condizioni per le quali anche soltanto una delle due (o più) condizioni espresse è vera. 3. NOT Quest'operatore inverte il valore ad esso associato: è vero restituisce un valore falso, mentre se è falso restituisce un valore vero. [Thanks Wikipedia] Ora che conosciamo tutti gli operatori con cui dovremo lavorare possiamo iniziare davvero a mettere mano al codice. Creiamo un Database Una volta avviato MySQL possiamo visualizzare tutti i database contenuti in essi digitando il semplice comando; mysql> SHOW DATABASES; Con questo comando si visualizzeranno tutti i database presenti in MySQL. E' molto importante che ogni comando che digitate alla fine possegga sempre un ";" perchè è solo quando vi sarà, che l'istruzione potrà essere eseguita da MySQL. Adesso mettiamo il caso che dopo aver digitato il comando SHOW DATABSES; MySQL vi visualizzi pressappoco questa situazione: mysql> SHOW DATABASES; Empty set (0.00 sec) Cosa significa questo? Semplicemente che non vi sono database su cui poter operare, indi adesso ne creeremo uno sui cui poter lavorare. La sintassi per creare un database è la seguente; mysql> CREATE DATABASE [Nome del database]; In questo modo creeremo un database che noi da adesso chiameremo in modo simbolico Prova. Eseguendo di nuovo il comando SHOW DATABASES; adesso avremmo una situazione differente da quella precedente dato il fatto che abbiamo appena creato un database. mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | Prova | +--------------------+ 1 rows in set (0.00 sec) Bene abbiamo finalmente creato il nostro primo database! Adesso però un database senza contenuti non ha alcuno scopo quindi andiamo a creare una tabella all'interno del nostro nuovo database “Prova”. Creiamo una Tabella Prima di creare una tabella dobbiamo conoscere i tipi di dati con cui ci troveremo ad operare, siccome nell'sql di tipi di dati ce ne sono davvero tanti analizzeremo solo i più influenti e più usati. • CHARACTER(n) Una stringa a lunghezza fissa di esattamente n caratteri. CHARACTER può essere abbreviato con CHAR. • CHARACTER VARYING(n) Una stringa a lunghezza variabile di al massimo n caratteri. CHARACTER VARYING può essere abbreviato con VARCHAR o CHAR VARYING. • INTEGER Un numero intero con segno. Può essere abbreviato con INT. La precisione, cioè la grandezza del numero intero che può essere memorizzato in una colonna di questo tipo, dipende dall'implementazione del particolare DBMS. • SMALLINT Un numero intero con segno con precisione non superiore a INTEGER. • FLOAT(p) Un numero a virgola mobile, con precisione p. Il valore massimo di p dipende dall'implementazione del DBMS. E' possibile usare FLOAT senza indicazione della precisione, utilizzando quindi la precisione di default, anch'essa dipendente dall'implementazione. REAL e DOUBLE PRECISION sono dei sinonimi per un FLOAT con una particolare precisione. Anche in questo caso le precisioni dipendono dall'implementazione, con il vincolo che la precisione del primo non sia superiore a quella del secondo. • DECIMAL(p,q) Un numero a virgola fissa di almeno p cifre e segno, con q cifre dopo la virgola. DEC è un'abbreviazione per DECIMAL. DECIMAL(p) è un'abbreviazione per DECIMAL(p,0). Il valore massimo di p dipende dall'implementazione. • INTERVAL Un periodo di tempo (anni, mesi, giorni, ore, minuti, secondi e frazioni di secondo). • DATE, TIME e TIMESTAMP Un preciso istante temporale. DATE permette di indicare l'anno, il mese e il giorno. Con TIME si possono specificare l'ora, i minuti e i secondi. TIMESTAMP è la combinazione dei due precedenti. I secondi sono un numero con la virgola, permettendo così di specificare anche frazioni di secondo. [Thanks tuoclick.ch] Bene detto questo andiamo ad analizzare la sintassi per la creazione di una tabella all'interno del nostro database; CREATE TABLE `prima_tabella` ( `id` INT(11) NOT NULL, `nome` VARCHAR(250) NOT NULL, `cognome` VARCHAR(250) NOT NULL, `data_nascita` DATE, PRIMARY KEY (`id`) ); Analizziamo punto per punto il codice della nostra tabella: CREATE TABLE `prima_tabella` Con CREATE TABLE andiamo a creare una tabella, utilizzeremo sempre questo tipo di comando per creare le nostre tabelle, tra gli apici inseriamo il nome della nostra tabella. ( `id` INT(11) NOT NULL, `nome` VARCHAR(250) NOT NULL, `cognome` VARCHAR(250) NOT NULL, `data_nascita` DATE, Una volta dato il comando per la creazione della tabella dovremo inserire dei dati al suo interno, quindi apriamo una parentesi ed inseriamo i vari dati con i loro tipi corrispettivi, il primo è l'id che come poi vedremo è anche la chiave primaria della nostra tabella, il valore di id è intero e non può superare le 11 unità (INT(11)) e non può risultare nullo pena l'annullamento dell'informazione inserita (NOT NULL). I valori nome e cognome sono dei VARCHAR e come si può facilmente intendere il loro valore potrà variare da 1 a 25 e come l'id non potrà essere nullo. Infine vi è la data_nascita che ha il valore di DATE e qui non c'è molto da spiegare, come avrete potuto notare ogni valore inserito alla fine viene chiuso con una virgola, queste sono le regole di sintassi dell'sql e per creare una tabella senza incombere in errori più o meno frustranti deve essere sempre rispettata. PRIMARY KEY (`id`) ); Ecco qui che si ripresenta il dato id, come vedere il nostro id assume il valore di chiave primaria, grazie al comando PRIMARY KEY, le chiavi primarie possono assumere un ruolo molto importante quando la mole dei nostri database assume delle dimensioni molto elevate, ed infine per il confronto fra tabelle differenti le chiavi primarie assumono un ruolo fondamentale. Una volta inseriti tutti i nostri valori all'interno della tabella non dovremo far altro che chiudere la nostra parentesi tonda aperta in precedenza con l'aggiunta del già noto; Adesso che abbiamo il codice spostiamoci di nuovo su MySQL per vedere come inserirla al suo interno. Eravamo rimasti alla creazione del nostro database Prova, ora dovremmo spostarci al suo interno per poter creare la nostra tabella, e lo faremo in questo modo: mysql> USE Prova; Database changed Con il comando USE ci siamo spostati all'interno del database Prova e adesso andremo ad inserire il codice della nostra tabella; mysql> CREATE TABLE `prima_tabella` ( -> `id` INT(11) NOT NULL, -> `nome` VARCHAR(250) NOT NULL, -> `cognome` VARCHAR(250) NOT NULL, -> `data_nascita` DATE, -> PRIMARY KEY (`id`) -> ); Query OK, 0 rows affected (0.13 sec) NOTA: Il puntatore '->' ci dice di completare l'istruzione, fino a quando non sarà completato o chiuso MySQL non ci farà eseguire alcun comando. Una volta inserita la nostra tabella con successo vorremmo anche visualizzarla e naturalmente l'MySQL corre in nostro soccorso, digitando: mysql> DESCRIBE prima_tabella; Riceveremo in input la tabella appena creata, pressapoco così: +--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | | | | nome | varchar(250) | NO | | | | | cognome | varchar(250) | NO | | | | | data_nascita | date | YES | | NULL | | +--------------+--------------+------+-----+---------+-------+ 4 rows in set (0.05 sec) Inserimento Dati Fino ad ora abbiamo visto come creare un database e come creare una tabella all'interno del nostro database, però non siamo ancora riusciti a far lavorare davvero il nostro database, è giunto il momento di inserire dei dati al suo interno. Riprendendo l'esempio della tabella precedente possiamo dire che i valori da inserire all'interno della nostra tabella sono quattro; id, nome, cognome, data_nascita. Procediamo a visionare il codice per l'inserimento dei dati all'interno della nostra tabella. INSERT INTO `prima_tabella` VALUES ('1', 'Luigi', 'Rossi', '2007-03-21'); Bene analizziamo la prima parte del comando ossia INSERT INTO `prima_tabella` possiamo capire che con INSERT INTO diamo il comando iniziale per l'inserimento dei dati all'interno della nostra tabella. Dopodichè dovremo inserire i nostri da inserire nella tabella con il comando ('1', 'Luigi', 'Rossi', '2007-03-21'); Una volta che abbiamo i dati da inserire nella nostra tabella riapriamo MySQL e inseriamoli. mysql> INSERT INTO `prima_tabella` -> ` VALUES ( -> `'1', 'Luigi', 'Rossi', '2007-03-21' -> ); Query OK, 1 row affected, 1 warning (0.13 sec) Una volta inviato il comando, avremo inserito i dati con successo, ora però è giunto il momento di visualizzare i dati inseriti nel nostro database. Query Bene adesso che abbiamo creato ed inserito dei dati all'interno della nostra tabella è arrivato il momento di visualizzare quei dati eseguendo una query sul nostro database! Dobbiamo introdurre quindi il comando SELECT che serve a punto per la visualizzazione dei nostri dati, ecco qui la sintassi per la visualizzazione dei nostri dati. SELECT * FROM `prima_tabella`; Spieghiamo il codice sovrastante; Come abbiamo già detto SELECT serve per visualizzare i nostri dati, l'asterisco sta per la totalità dei dati, cioè verrà mostrato tutto il contenuto senza alcuna limitazione o limite imposto da parte nostra, FROM `prima_tabella` e di facile intuizione, ci dice infatti che dovremo visualizzare i dati della prima_tabella, ricapitolando la sintassi della query è molto semplice e praticamente dice che; VISUALIZZA (Tutto) DALLA `prima_tabella` Molto semplice quindi. Vediamo cosa ci restituisce quindi il comando, una volta inoltrato in MySQL. mysql> SELECT * FROM `prima_tabella`; +------+-------+-----------+---------------+ | id | nome | cognome | data_nascita | +------+-------+-----------+---------------+ | 1 | Luigi | Rossi | 2007-03-21 | +------+-------+-----------+---------------+ 1 row in set (0.00 sec) Come potete vedere viene visualizzata la query contenente Luigi Rossi (il nostro unico dato tra l'altro :P). Adesso effettueremo delle operazioni sulle query da far visualizzare quindi inseriamo altri due dati all'interno della nostra tabella, che adesso sappiamo andrà inserito con il comando INSERT INTO! Riporto qui per i più pigri due query di prova. INSERT INTO `prima_tabella` VALUES ('2', 'Mario', 'Bianchi', '2007-03-22'); INSERT INTO `prima_tabella` VALUES ('3', 'Gianni', 'Verdi', '2007-03-23'); Una volta inseriti andiamo avanti nella visualizzazione delle query. Adesso andremo a selezionare la nostra query settando però delle condizioni precise alla query, introducendo il concetto del comando WHERE. La sintassi del comando è molto semplice "WHERE `condizione da soddisfare`" un esempio per dimostrare la potenzialità del comando. SELECT * FROM `prima_tabella` WHERE `cognome` = 'Verdi'; Spieghiamo il codice partendo da WHERE, in questo caso poniamo la condizione che vedrà la query da mostrare solo se il valore cognome sia uguale a Verdi, nel caso che questo valore non sia soddisfatto la query mostrerà un errore perchè il valore che cerchiamo non esiste. Nel nostro caso invece la query risulterà positiva perchè abbiamo inserito il valore poco prima e quindi il risultato della query sarà il seguente; mysql> SELECT * FROM `prima_tabella` -> WHERE `cognome` = 'Verdi'; +----+---------+------------+---------------+ | id | nome | cognome | data_nascita | +----+---------+------------+---------------+ | 3 | Gianni | Rossi | 2007-03-23 | +----+---------+------------+---------------+ 1 row in set (0.00 sec) Abbiamo quindi visto come visualizzare una query esprimendo una condizione precisa adesso cerchiamo di dare una condizione dove possono presentarsi anche più di un risultato. SELECT * FROM `prima_tabella` WHERE `data_nascita` >= '22-03-2007'; In questo caso è facile intuire che saranno mostrati solo i dati che risulteranno maggiori o uguali alla data di nascita da noi impostata. Adesso andiamo ad inserire il comando in MySQL. mysql> SELECT * FROM `prima_tabella` -> WHERE `data_nascita` >= '22-03-2007'; +----+---------+------------+---------------+ | id | nome | cognome | data_nascita | +----+---------+------------+---------------+ | 2 | Mario | Bianchi | 2007-03-22 | | 3 | Gianni | Rossi | 2007-03-23 | +----+---------+------------+---------------+ 2 rows in set (0.00 sec) Come avevamo previsto, sono state mostrate solo le due query che risultavano uguali o maggiori della data da noi inserita come parametro di ricerca. Qui finisce la prima guida sull’SQL spero che questa piccola introduzione vi possa spronare allo studio di questo facile linguaggio per la gestione di database :] ~ Nelle Prossime guide … Prossimamente proseguirò questa guida descrivendo in modo più dettagliato e completo l’utilizzo degli operatori di cui fa utilizzo l’SQL all’interno di query sempre più complesse che potremo gestire per le nostre ricerche. Inoltre una volta giunti ad un livello sufficiente inizierò anche una guida su come interagire con l’SQL tramite altri linguaggi di programmazione e per altri linguaggi intendo php :°D ~ Siti Utili big-bug.net, hackerforum.devil.it ~ Copyright Quest’opera è pubblicata sotto una Licenza Creative Commons.