Torna all'elenco degli articoli Articoli
Tempo di lettura: 8 minuti

8 suggerimenti che i principianti assoluti possono usare per correggere le query SQL

Gli errori di codice sono comuni e frustranti. E quando si sta imparando l'SQL, può essere molto difficile trovare e correggere i propri errori. In questo post vi mostreremo otto modi per risolvere o eliminare gli errori di codifica SQL più comuni.

Oggi parleremo di alcuni suggerimenti che i principianti di SQL possono utilizzare per evitare diversi errori comuni. Questi suggerimenti funzionano in qualsiasi ambiente di database. Man mano che procediamo, mostreremo alcuni messaggi di errore. La formulazione esatta dei messaggi di errore potrebbe essere leggermente diversa, ma non preoccupatevi: ogni motore di database ha le proprie varianti, ma il significato è lo stesso.

Detto questo, non ci concentreremo sui messaggi di errore. Invece, individueremo la causa effettiva del problema (come la dimenticanza di una parentesi o di una virgoletta). In questo modo, imparerete come aggirare il problema in primo luogo.

Pronti? Iniziamo!

1. Mettere prima le parentesi aperte e chiuse

Ricordare il carattere di chiusura è fondamentale per eliminare parentesi, virgolette, doppi apici o parentesi quadre sbilanciate. Le migliori pratiche suggeriscono di digitare prima entrambi i caratteri (aperto e chiuso) e poi di digitare ciò che va all'interno.

L'esempio seguente mostra un errore quando le parentesi non sono bilanciate:

SELECT lastname, firstname FROM employee 
WHERE salary >= (select AVG(salary) from employee ;
ERROR:  syntax error at or near ";"
LINE 2: WHERE salary >= (select AVG(salary) from employee ;

Esempio 1: Parentesi non bilanciate

2. Non mettere una virgola alla fine di una sequenza di colonne o tabelle

In SQL le virgole fungono da separatore. Non ci dovrebbero essere virgole tra FROM e il primo nome di tabella o dopo il nome finale della tabella. La stessa idea si applica alla definizione delle colonne: quando si crea una tabella, bisogna assicurarsi di non inserire una virgola in più dopo il nome finale della colonna.

È un errore molto comune.

SELECT * FROM employee, department,
ERROR:  syntax error at or near ","
LINE 1: SELECT * FROM employee, department

Esempio 2: una virgola in più

3. Utilizzare la valutazione parziale delle query per eseguire il debug di query SQL lunghe

Molti client SQL come Navicat o pgAdmin consentono l'esecuzione parziale di una query. È possibile farlo utilizzando il mouse per evidenziare una parte del codice. Utilizzando questa tecnica divide et impera, è possibile isolare e correggere facilmente gli errori. Ovviamente, la parte evidenziata deve essere SQL valido.

La prossima query presenta due errori. Se eseguiamo la riga iniziale della query, possiamo vedere il primo problema. (Suggerimento: la colonna "llastname" non esiste).

SELECT llastname, firstname FROM employee 
WHERE salary >= (select MAXI(salary) from employee ;
ERROR:  column "llastname" does not exist
LINE 1: SELECT llastname, firstname FROM employee 

Esempio 3: un nome di colonna errato

Se invece eseguiamo l'intera istruzione SQL, otteniamo un errore relativo alle parentesi sbilanciate:

SELECT llastname, firstname FROM employee 
WHERE salary >= (select MAXI(salary) from employee;
ERROR:  syntax error at or near ";"
LINE 2: WHERE salary >= (select MAX(salary) from employee ;

Esempio 4: Subquery con parentesi sbagliate

Possiamo anche contrassegnare una subquery ed eseguirla singolarmente, come nell'esempio successivo:

SELECT llastname, firstname FROM employee 
WHERE salary >= (select MAXI(salary) from employee;
ERROR:  function maxi(numeric) does not exist
LINE 1: select MAXI(salary) from employee

Esempio 5: Nome di funzione errato

4. Attenzione ai nomi delle colonne e delle tabelle

Prestate molta attenzione quando digitate i nomi delle colonne o delle tabelle. Se possibile, cercate di copiare e incollare il nome da un comando che sapete essere corretto, preferibilmente uno già eseguito correttamente. Le migliori pratiche suggeriscono di copiare e incollare i nomi anche se si pensa che sia più dispendioso in termini di tempo rispetto alla digitazione.

Il nome di una colonna scritto male o il riferimento a una colonna di una tabella non presente nella clausola FROM è molto comune. Cercate sempre gli errori di battitura nel nome della colonna, assicuratevi che la tabella in FROM abbia questa colonna e assicuratevi che la tabella sia menzionata in FROM.

SELECT llastname, firstname FROM employees
ERROR:  table "employees" does not exist
LÍNEA 1: SELECT llastname, firstname FROM employees

Esempio 6: Nome di tabella errato

Un'altra buona pratica è quella di usare un alias di tabella o un nome di tabella come prefisso di colonna. Questo è doppiamente importante quando si hanno due o più tabelle nella clausola <>FROM. Il seguente errore può apparire se si fa riferimento a due colonne con nome identico in tabelle diverse:

SELECT lastname, name 
FROM department, employee
WHERE depto_id = depto_id
ERROR:  column reference "depto_id" is ambiguous
LINE 3: WHERE depto_id = depto_id

Esempio 7: Nomi di colonna ambigui

SELECT lastname, name 
FROM department, employee
WHERE department.depto_id = employee.depto_id

Esempio 8: Nomi di colonna prefissati

Per risolvere questi errori, aggiungere il nome della tabella prima del nome della colonna. (Nell'esempio precedente, si tratta di employee.depto_id e department.depto_id invece di depto_id).

5. Confrontare solo i tipi di dati compatibili

Quando si scrivono condizioni di confronto nella clausola WHERE, assicurarsi che entrambi i tipi di dati siano compatibili con l'operatore di confronto e tra loro. Se ciò non è possibile, potrebbe essere necessario eseguire il cast di uno dei tipi di dati. La regola generale è quella di confrontare numeri con numeri, stringhe di caratteri con stringhe di caratteri e così via.

Alcuni sistemi di database convertono automaticamente i tipi di dati, ove possibile; altri forniscono conversioni avanzate dei tipi di dati (ad esempio, un valore TIMESTAMP può essere convertito automaticamente in DATE prima del confronto). Altri servizi di database non offrono alcuna conversione. Pertanto, è meglio controllare da soli questi potenziali problemi.

In ogni caso, il seguente codice SQL riceve un errore di mancata corrispondenza dei dati perché una stringa CHAR viene confrontata con un valore intero:

SELECT lastname, salary 
FROM employee
WHERE depto_id = firstname
ERROR:  operator does not exist: integer = character varying
LINE 3: WHERE depto_id = firstname

Esempio 9: tipi di dati non corrispondenti

Nessun operatore corrisponde al nome e ai tipi di argomenti indicati. Potrebbe essere necessario aggiungere cast espliciti di tipo per risolvere questo problema.

6. Utilizzare IS NULL quando si confrontano valori NULL

Se dovete solo verificare se una colonna ha un valore NULL, prestate particolare attenzione alle espressioni che utilizzate. Un errore comune è quello di usare = NULL o <> NULL, ma queste espressioni non sono sintatticamente valide. Utilizzate invece le clausole IS NULL e IS NOT NULL.

Vediamo gli esempi errati e corretti:

SELECT firstname, lastname
FROM employee
WHERE depto_id = NULL

Esempio 10: Confronto NULL errato

SELECT firstname, lastname
FROM employee
WHERE depto_id is NULL

Esempio 11: Confronto NULL corretto

7. Includere sempre la condizione JOIN

Esiste più di un modo valido per eseguire un join in SQL. Il modo tradizionale consiste nell'elencare tutte le tabelle da unire nella clausola FROM e inserire le condizioni di unione nella clausola WHERE per creare coppie di record. L'altro modo (più dichiarativo) consiste nell'utilizzare la clausola JOIN ed elencare le condizioni di unione dopo la clausola ON. Entrambi sono sintatticamente equivalenti, ma è necessario sapere come identificare le condizioni di join per entrambi.

Qui abbiamo due join validi:

SELECT lastname, name 
FROM department, employee
WHERE department.depto_id = employee.depto_id
SELECT lastname, name 
FROM department JOIN employee ON department.depto_id = employee.depto_id

Esempio 12: Due join equivalenti

Tuttavia, il consiglio è: Non dimenticate la condizione di unione! Ogni volta che si uniscono due o più tabelle, è necessario scrivere una condizione di unione per collegare entrambe le tabelle. Se non la si specifica, non si otterrà un messaggio di errore, ma solo risultati errati. Questi saranno errati perché ogni record della prima tabella sarà unito a tutti i record della seconda tabella. Questo tipo di risultato è chiamato prodotto cartesiano di due tabelle e di solito non è un risultato atteso.

SELECT lastname, name 
FROM department, employee

Esempio 13: Un prodotto cartesiano - di solito non è il risultato desiderato

8. Includere le colonne non aggregate dell'elenco SELECT nelle colonne GROUP BY

Quando si usano le funzioni aggregate, ci sono alcune restrizioni sulle colonne che possono essere incluse nell'elenco SELECT (cioè i nomi delle colonne dopo la clausola SELECT ). È possibile includere solo le colonne specificate nella clausola GROUP BY, oltre alle funzioni aggregate e alle costanti. Se si selezionano solo le colonne aggregate, qualsiasi altra colonna genera un errore. Lo si può vedere nell'esempio seguente.

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
GROUP BY department.depto_id
ERROR:  column "department.name" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT  department.depto_id, name , count(*) employees

Esempio 14: Colonne extra nell'elenco SELECT

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
GROUP BY department.depto_id

Esempio 15: Nessuna colonna extra nell'elenco SELECT

A volte è necessario filtrare i dati utilizzando una funzione di aggregazione. Uno degli errori più comuni è quello di inserire nella clausola WHERE una condizione che utilizza la funzione aggregata. Questo esempio è riportato di seguito:

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
AND count(*) > 1
GROUP BY department.depto_id
ERROR:  aggregate functions are not allowed in WHERE
LÍNEA 4: AND count(*) > 1

Esempio 16: Funzione aggregata errata nella clausola WHERE

Ricordate che se dovete filtrare usando una funzione aggregata, il modo corretto è inserire la condizione usando l'aggregato nella clausola HAVING, come nell'esempio seguente:

SELECT  department.depto_id, name , count(*) employees
FROM department, employee
WHERE department.depto_id = employee.depto_id
HAVING count(*) > 1
GROUP BY department.depto_id

Esempio 17: La funzione aggregata è nella clausola HAVING

Provate voi stessi!

LearnSQL è un ottimo posto per iniziare a usare SQL. Diversi corsi sono rivolti agli studenti principianti. Potete testare i suggerimenti di questo articolo con gli esercizi di questo corso SQL.