Insegnare l'SQL su MySql

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 ad ogni regione di residenza un nome casuale tra quelli del gruppo.

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

 

Full Join non utilizzabile

Un altro argomento fondamentale in un corso introduttivo sull’SQL sono le varie tipologie di JOIN. Per quanto un programmatore esperto possa raggiungere lo stesso obiettivo con del codice più complicato (a questo link trovi una discussione a riguardo sul sito Stackoverflow), 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.

 

Gestione JOIN senza ON

Purtroppo le mie esperienze in azienda mi hanno mostrato come tutt’oggi molti sviluppatori utilizzino la sintassi deprecata “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 ad una cross join.

SELECT  *
FROM    Fatture
INNER JOIN Clienti;

 

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 una nuova colonna con l’attributo NULL se la tabella è già popolata. 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 ad errate conversioni 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 legati 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;

 

Articoli correlati

Nel seguente articolo analizziamo le differenze tra Sql Server e Oracle per lavorare correttamente su entrambi gli ambienti.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Torna su