MySql: cinque avvertenze per chi inizia a imparare l’SQL

In questo articolo analizzerò cinque peculiarità della sintassi SQL sul database relazionale MySql che è bene conoscere per evitare errori. Alcune di queste caratteristiche potrebbero essere viste come un “benefit” se osservate dal punto di vista di un programmatore esperto, ma per chi inizia da poco ad approcciarsi all’SQL possono rivelarsi una fonte di errori o di mancanza di comprensione di quella che è la logica del linguaggio.

Gestione colonne non raggruppate in MySQL

Molto spesso, il primo concetto un po’ ostico da digerire per gli studenti all’interno di un corso introduttivo di SQL è il raggruppamento. Infatti, nonostante le ripetute raccomandazioni, è molto forte all’inizio la tentazione di aggiungere nella select delle colonne che non sono presenti nel group by, senza l’utilizzo di funzioni di aggregazioni. In questi casi, un messaggio di errore sarebbe gradito ed “educativo”. Invece su Mysql, una query come la seguente compila senza errori, associando a ogni regione di residenza un nome casuale tra quelli del gruppo.

SELECT   
   RegioneResidenza,
   Nome, 
   COUNT(*) as NumeroClienti
FROM     Clienti
GROUP BY RegioneResidenza;

Ho notato anche che questa sintassi viene spesso utilizzata erroneamente per risolvere classici problemi come “estrarre la riga più recente per ogni gruppo”, portando a output errati (guarda qui per risolvere questa tipologia di problemi)

Gestione JOIN senza ON

Tutt’oggi molti sviluppatori utilizzano la sintassi “virgola nella From più condizioni nella where” per eseguire una JOIN tra più tabelle, scrivendo query come questa

SELECT *
FROM   Fatture, 
       Clienti 
WHERE  Fatture.IdCliente = Clienti.IdCliente;

Tra i molteplici motivi per cui questa sintassi è sconsigliata (ne parlo più approfonditamente a questo link), potrebbe esserci quello per cui l’inavvertita cancellazione delle condizioni nella where porterebbe a dei risultati palesemente errati, invece di un errore in fase di compilazione. Tuttavia ciò non si applica a MySql. La query seguenti infatti compila ed è equivalente a una CROSS JOIN:

SELECT  *
FROM    Fatture
INNER JOIN Clienti;

Full Join non utilizzabile

Un altro argomento fondamentale in un corso introduttivo sull’SQL sono le varie tipologie di JOIN. Per quanto si possa raggiungere lo stesso obiettivo con un codice più complicato (ti faccio vedere come a questo link), dal punto di vista didattico la mancanza della FULL JOIN risulta frustante per gli insegnanti e per gli studenti, in quanto nel flusso della lezione è naturale chiedersi quale sintassi utilizzare per avere un comportamento pari “all’unione” dei costrutti LEFT JOIN e RIGHT JOIN.

Creare nuove colonne in tabelle di MySQL già popolate

Dopo le lezioni sull’interrogazione, si passa alle istruzioni DML. Reputo molto istruttivo dal punto di vista didattico far riflettere gli studenti sulla necessità di definire con l’attributo NULL una nuova colonna di una tabella contenente già alcune righe. Dopo la creazione, aggiorneremo tale colonna con un update e infine, se necessario, la modificheremo per darle l’attributo NOT NULL.

Su MySQL invece possiamo tranquillamente aggiungere fin da subito una colonna con l’attributo NOT NULL. Verranno inseriti in automatico degli zeri se la colonna è di tipo numerico, o alternativamente delle stringhe vuote. Tale comportamento può essere anche comodo in fase di sviluppo per un programmatore esperto e consapevole, ma dal punto di vista didattico non è l’ideale per chi sta imparando.

Operazioni tra tipi differenti

Una fetta importante degli errori runtime su codice Sql è legato a conversioni errate in operazioni tra dati di tipo differente.
Dal punto di vista didattico reputo fondamentale investire molto tempo sul concetto di tipo associato alle colonne, sottolineando come esso sia un elemento cardine nella definizione di tabella e di quante problematiche (anche legate alle performance) possa portare la scelta di tipi sbagliati. Usare MySql per fare le dimostrazioni non è proprio l’ideale visto che questa query compila e restituisce in output il valore 1.

SELECT 'a' + 1;

Continua a imparare

Torna in alto
Torna su