21st Jul 2022 Tempo di lettura: 8 minuti 8 suggerimenti che i principianti assoluti possono usare per correggere le query SQL Marcos Pierri come come fare in sql Indice 1. Mettere prima le parentesi aperte e chiuse 2. Non mettere una virgola alla fine di una sequenza di colonne o tabelle 3. Utilizzare la valutazione parziale delle query per eseguire il debug di query SQL lunghe 4. Attenzione ai nomi delle colonne e delle tabelle 5. Confrontare solo i tipi di dati compatibili 6. Utilizzare IS NULL quando si confrontano valori NULL 7. Includere sempre la condizione JOIN 8. Includere le colonne non aggregate dell'elenco SELECT nelle colonne GROUP BY Provate voi stessi! 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. 6 errori comuni di sintassi che tutti gli studenti di SQL commettonohttps://t.co/owxdMv9UNT#sql #ImparareSQL #Database - Vertabelo (@Vertabelo) 3 gennaio 2017 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. Tags: come come fare in sql