Introduzione ad SQL e tipi di dati

Introduzione ad SQL e tipi di dati

Nel post precedente avevamo visto che cos'era il monitor e come sia possibile avviare il monitor.
Nel presente post, tratteremo invece una mini guida pratica per poter iniziare ad utilizzare il monitor precedentemente presentato.

Bene! Innanzi tutto bisogna sapere che l'utilizzo del monitor è strettamente correlato con il linguaggio SQL, di cui si può reperire un'ottima introduzione al seguente link: http://it.wikipedia.org/wiki/SQL.

MA CHE COS'E' SQL?
SQL (si pronuncia [ˈɛsˈkjuˈɛl], o informale [ˈsiːkwəl]) è un linguaggio che in pratica permette di effettuare le quattro operazioni «cardinali» su un qualunque database, grazie appunto alla caratteristica di essere un linguaggio standard. Parlando inceve di operazioni «cardinali», nello specifico intendo:

  1. INSERIMENTI
  2. MODIFICHE
  3. CANCELLAZIONI
  4. RICERCHE

La cosa che credo lo renda uno standard «de facto» per la gestione dei database è quella di essere diventato oramai molto diffuso poichè è perfettamente indipendente dal motore di database a cui si applica e basta un semplice monitor (una riga di comando) da cui poterlo utilizzare; inoltre il linguaggio SQL può venire utilizzato con la medesima «grammatica» sia su un motore MySQL, Postgres, Oracle, MS-SQL e perché no, anche su Access.
Nello specifico il poter impartire comandi tramite opportune istruzione da un semplice editor, lo rende particolarmente adatto anche all'interfacciamento con altri sistemi di gestione software.
Nella realtà ogni motore di database possiede un suo particolare «dialetto» che si differenzia di poco dagli altri dialetti soltanto per alcune caratteristiche intrinseche derivate dal motore che si va ad utilizzare. Quindi a tutti gli effetti, almeno le caratteristiche principali sono "standard".
In questo mio breve post, tratteremo assieme almeno i comandi principali, in modo tale da poter sin da ora essere operativi.

Iniziamo subito provando a costruire dal monitor un database di prova; il comando che segue, inserito direttamente nel monitor ci permetterà di fare proprio questo:

CREATE DB nome_database;

L'istruzione vista sopra genera un nuovo database che chiaramente sarà vuoto, non conterrà nulla.
Per poter usufruire di questo nostro database bisognerà indicarlo in modo specifico; questo può essere fatto con:

USE nome_database;

L'istruzione di sopra permette di esplicitare quale database verrà utilizzato.

Da notare che ogni istruzione SQL viene terminata con il carattere ";", questo dice sostanzialmente all'interprete SQL che l'istruzione è terminata e, di conseguenza, richiede la sua esecuzione.

Bene! A questo punto, senza rimandare ulteriormente, introdurrei subito la sintassi essenziale per la costruzione delle tabelle. Abbiamo già incontrato ed abbiamo già parlato delle tabelle; queste infatti si possono considerare a tutti gli effetti come gli elementi più importanti di un database in quanto sono i «contenitori» dei nostri dati.
Il nome della tabella può essere scritto indifferentemente in "MAIUSCOLO" o in "minuscolo", in ogni caso, però, è necessario che rispetti le seguenti regole:

  1. Può essere formato da lettere e numeri, ma il primo carattere deve sempre essere una lettera;
  2. Il nome non può superare i 30 caratteri di lunghezza;
  3. Non può avere lo stesso nome di una tabella o vista già esistente sullo stesso database.

Vediamo quindi la sintassi base per la loro costruzione:

CREATE TABLE nome_tabella(
nome_colonna1 tipo di dato costraint (opzionale),
nome_colonna2 tipo di dato constraint (opzionale),
nome_colonna3 tipo di dato constraint (opzionale),
...
nome_colonnaN tipo di dato constraint (opzionale) );

Tenete presente che con il termine constraint si indica un vincolo di integrità referenziale che analizzeremo succesivamente in modo più approfondito e di cui tratteremo anche la filosofia che sta alla base di tale concetto.

Piccola NOTA polemica - Quindi è oramai sorpassata, l'affermazione che viene fatta in molti manuali di informatica, dove si afferma che MySQL è un motore di database performante grazie al fatto di rinunciare ad alcune caratteristiche che molti altri database relazionali possiedono. Con le utime release di MySQL sono state introdotte caratteristiche avanzate che oramai sono in versione stabile, come ad esempio l'integrità referenziale, i triggers, le transazioni, le viste e le stored procedures; tutti argomenti che spero di vedere assieme a Voi nei miei prossimi post. Tutte queste ultime caratteristiche avanzate sono presenti in altri DBRMS già da tempo e la cui mancanza è sempre stata rinfacciata a MySQL, oramai i diretti concorrenti dovranno denigrarlo con qualche altra affermazione .... 😀

Introduzione ad SQL e tipi di dati

Restiamo al di sopra delle varie polemiche, tentiamo invece di essere costruttivi: sarà opportuno concentrarsi su quali siano i tipi di dati che possiamo gestire. Cosa, questa, molto importante visto e considerato che le tabelle, come detto sopra, consentono la memorizzazione e quindi la persistenza dei dati eventualmente ed opportunamente passati a MySQL.

TIPI DI DATI

I tipi di dati che si possono trattare si possono distinguere, a mio avviso, in differenti categorie:

Esiste poi un tipo particolare di valore, al di sopra delle parti, che non appartiene a nessuna categoria e che per sua natura rappresenta un non valore, quindi un valore inesistente, esso è NULL. Tale valore viene utilizzato per indicare solitamente che un campo non è stato inserito. Se ci pensate bene, ha molto senso, visto che pure "0" (zero) rappresenta pur sempre un valore di tipo numerico; in modo altrettanto analogo si può fare la medesima considerazione per la stringa nulla, cioé il valore "" (stringa nulla) è pur sempre un carattere. Ecco quindi spiegata l'esigenza di poter usufruire di un particolare tipo di valore che ci indichi la NON esistenza: questo è NULL (nullo) e vedremo il suo utilizzo pratico a breve.

DATI NUMERICI

I dati di tipo numerico si possono a loro volta distinguere in altre due categorie più specifiche:

  • INTERI (es.: 1; 2; -14; 0; 15; etc..)
  • NON INTERI (es.: 1,243; 3,141; -15,00156131; 0; 15e-12; -15e+12; etc..)

NUMERICI INTERI

In linguaggio SQL gli interi possono essere definiti nei seguenti modi:

  • TINYINT
  • SMALLINT
  • MEDIUMINT
  • INT o INTEGER
  • BIGINT

Se avete una ben minima infarinatura della lingua inglese scoprirete che INT e/o INTEGER significano INTERO, mentre tutti gli altri suffissi si riferiscono alla dimensione del dato.

In effeti più memoria macchina si alloca, quindi più risorse vengono dedicate, alla rappresentazione di un dato, e tanto maggiore sarà il grado di rappresentazione o l'intervallo rappresentato da tale dato. Quest'ultima affermazione vale per qualunque altra tipologia di dato che si andrà a descrivere, ecco quindi che per i numeri interi si può scrivere:

  • TINYINT [(M)] 1 byte
    • Valori con segno da -128 a 127 (da -2 elevato alla 7 a 2 elevato alla 7 -1)
    • e da 0 a 255 senza segno (da 0 a 2 elevato alla 8 -1)
  • SMALLINT [(M)] 2 byte
    • Valori con segno da -32768 a 32767 (da-2 elevato alla 15 a 2 elevato alla 15 -1)
    • e da 0 a 65535 senza segno (da 0 a 2 elevato alla 16 -1)
  • MEDIUMINT [(M)] 3 byte
    • Valori con segno da -8388608 a 8388607 (da-2 elevato alla 23 a 2 elevato alla 23 -1)
    • e da 0 a 16777215 senza segno (da 0 a 2 elevato alla 24 -1)
  • INT[(M)] o INETEGER 4 byte
    • Valori con segno da -2147483648 a 2147483647 (da-2 elevato alla 31 a 2 elevato alla 31 -1)
    • e da 0 a 4294967295 senza segno (da 0 a 2 elevato alla 32 -1)
  • BIGINT[(M)] 8 byte
    • Valori con segno da -9223372036854775808 a 9223372036854775807 (da-2 elevato alla 63 a 2 elevato alla 63 -1)
    • e da 0 a 18446744073709551615 senza segno (da 0 a 2 elevato alla 64 -1)

Oltre a queste parole chiave (da ora "Key words"), si possono altresì utilizzare anche degli specificatori come SIGNED (default) o UNSIGNED con i quali è possibile specificare se il dato numerico sia tratto o meno con segno. Come si potrà dedurre dall'elenco sopra riportato, nel caso di rappresentazione senza segno, la grandezza numerica viene raddoppiata, in quanto i bit macchina messi a disposizione per la rappresentazione del dato rimangono pressoché inalterati recuperando però il bit di segno!

NUMERICI NON INTERI

Anche per la rappresentazione dei dati decimali si provvede ad effettuare delle distinzioni analoghe a quanto visto sopra. Si potrà quindi scrivere i seguenti intervalli:

  • FLOAT [(M,D)] 4 byte
    • Valori minimi diversi da zero: ±1,175494351E-38
    • Valori massimi diversi da zero: ±3,402823466E+38DOUBLE [(M,D)] 8 byte
  • DOUBLE [(M,D)] 8 byte
    • Valori minimi diversi da zero: ±2,2250738585072014E-308
    • Valori massimi diversi da zero: ±1,7976931348623157E+308
  • DECIMAL [(M,D)] M byte (vers. MySQL < 3.23) o M+2 byte (con vers. MySQL >= 3.23)
    • Varia; l'arco di valori dipende da M e D

Anche in questo caso valgono le medesime considerazioni viste sopra in merito all'uso degli specificatori SIGNED (default) o UNSIGNED. Ecco quindi spiegato come poter rappresentare valori numerici superiori come grandezza 🙂

DATI ALFANUMERICI (STRINGHE) E DATI BINARI

Tutti i dati che non si possono rappresentare in modo numerico verranno espressi e trattati con stringhe alfanumeriche.

Ho deciso di inserire in questa sezione la trattazione sia delle stringhe, quanto quella sui dati binari, questo perché i dati binari altro non sono che una sequenza di caratteri (esadecimali), quindi una stringa in formato ASCII, che consente la rappresentazione in linguaggio macchina di un qualunque oggetto che può essere manipolato e gestito dal nostro PC.
L'unica differenza sostanziale fra un tipo binario ed uno di tipo stringa, consiste nel fatto che:

Le stringhe utilizzano un set di caratteri standard appropriato dato dalla definizione del database o dalla definizione della tabella, in modo tale da poter permettere una corretta rappresentazione dei caratteri per la nazionalità in uso (si pensino ad esempio ai caratteri cinesi, arabi etc.. sicuramente differenti dai nostri). Un tipico set di caratteri usati per l'Italia sono UTF8 e LATIN1.

I dati binari differiscono dalle stringhe in quanto non subiscono il formato, essi vengono rappresentati con caratteri di tipo ASCII.

Le stringhe (ed analogamente i dati di tipo binario) si rappresentano fra apici, per esempio:

'Questa è una stringa'

La rappresentazione delle stringhe in linguaggio SQL può essere fatta con le seguenti parole chiave:

STRINGHE ed ALFANUMERICI

  • CHAR (n) Stringa a lunghezza fissa. "n" byte
  • VARCHAR (n) Stringa a lunghezza variabile. "n" byte
  • TINYTEXT Stringa testo di dimensioni molto piccole. 2 elevato alla 8 -1
  • TEXT Stringa testo di dimensioni piccole. 2 elevato alla 16 -1
  • MEDIUMTEXT Stringa testo di dimensioni medie. 2 elevato alla 24 -1
  • LONGTEXT Stringa testo di dimensioni considerevoli. 2 elevato alla 32 -1
  • ENUM ('valore1', 'valore2', ...) Rappresenta un insieme di valori per dal quale è possibile selezionarne soltanto uno. 65535 membri disponibili, 1 o 2 byte.
  • SET ('valore1', 'valore2', ...) Rappresenta un insieme di valori dal quale è possibile selezionarne più di uno. 64 membri disponibili, 1,2,3,4, o 8 byte.

CHAR e VARCHAR sono i tipi di dati a stringa più utilizzati e si differenziano fra di loro per come trattano il dato memorizzato: il primo è un tipo a lunghezza fissa, il secondo a lunghezza variabile. I valori di una colonna CHAR(M) richiedono M byte per la loro registrazione, nel caso in cui il dato fosse troppo piccolo (minore di M byte), la sua lunghezza verrebbe portata alla dimensione dichiarata per la colonna accodando ad esso degli spazi. Tale cosa non accade invece con il tipo VARCHAR il quale invece utilizza soltanto lo spazio minimo necessario per la rappresentazione della stringa da elaborare, più un byte per la memorizzazione della lunghezza della stringa stessa (quindi a mio avviso VARCHAR è più conveniente del CHAR poiché consente di risparmiare spazio in fase di memorizzazione).

ENUM e SET sono dei tipi di colonna abbastanza speciali, i cui valori vanno scelti da una lista predefinita di stringhe. La differenza fondamentale tra i due tipi, consiste nel fatto che i valori definiti con ENUM sono un unico elemento scelto da una lista; mentre i valori di SET possono contenere un qualsiasi numero di elementi, al limite anche tutti i valori della lista stessa. In altre parole, ENUM viene utilizzato per valori che sono mutualmente esclusivi, mentre SET consente di scegliere anche più volte gli stessi valori (a mio avviso, ed in base alla mia esperienza, SET è un tipo di dato che se possibile andrebbe evitato, poichè viene meno al primo principio della 1NFA, prima forma normale, il quale è stato esposto nella mia prima trattazione sui database).

DATI BINARI

In modo del tutto analogo a quanto visto sopra avremo i corrispondenti per i dati binari:

  • TINYBLOB Stringa binaria di dimensioni molto piccole. 2 elevato alla 8 -1
  • BLOB Stringa binaria di dimensioni piccole. 2 elevato alla 16 -1
  • MEDIUMBLOB Stringa binaria di dimensioni medie. 2 elevato alla 24 -1
  • LONGBLOB Stringa binaria di dimensioni considerevoli. 2 elevato alla 32 -1

VALORI TEMPORALI

Le date e le ore sono rappresentate da valori del tipo '2007-12-16' o '18:02:30', ma MySQL anche valori combinati di data/ora quali '2007-12-16 18:02:30'. Prestate attenzione al fatto che il server indica le date nel formato anno-mese-giorno, formato stadard ANSI SQL (conosciuto anche come ISO8601) ma spiazzante per i principianti.
Potete comunque visualizzare le date in qualsisi modo si desideri attraverso l'utilizzo del comando DATE_FORMAT() [vedi qui].
Vediamo ora quali sono le key words per poter definire campi per la memorizzare dei dati temporali:

  • DATE 3 byte da '1000-01-01' a '9999-12-31'
  • TIME 3 byte da '-838:59:59' a '838:59:59'
  • DATETIME 8 byte da '1000-01-01 00:00:00' a '9999-12-31 23:59:59'
  • TIMESTAMP [(M)] 4 byte da '19700101000000' ad un momento imprecisato dell'anno 2037
  • YEAR [(M)] 1 byte dal 1901 a 2155 per YEAR(4) e da 1970 a 2069 per YEAR(2)

Qui concludo questo mio "piccolo" post, sperando di aver l'occasione di poter scrivere la sua continuazione a breve, sperando di vederVi numerosi ed interessati al nostro prossimo appuntamento, aspetto ansioso i Vostri commenti.

Pubblicato in Documentazione Tecnica, MySQL e taggato , .