Zurück zur Artikelliste Artikel
8 Leseminuten

8 Tipps, mit denen auch absolute Anfänger SQL-Abfragen korrigieren können

Code-Fehler sind häufig - und frustrierend. Und wenn man SQL gerade erst lernt, kann es sehr schwierig sein, die Fehler zu finden und zu beheben. In diesem Beitrag zeigen wir Ihnen acht Möglichkeiten, wie Sie häufige SQL-Codierungsfehler lösen oder beseitigen können.

Heute sprechen wir über einige Tipps, die SQL-Anfänger verwenden können, um verschiedene häufige Fehler zu vermeiden. Diese Tipps sind in jeder Datenbankumgebung anwendbar. Im weiteren Verlauf werden wir einige Fehlermeldungen zeigen. Der genaue Wortlaut Ihrer Fehlermeldungen kann ein wenig anders sein, aber keine Sorge, jede Datenbank-Engine hat ihre eigenen Varianten, aber die Bedeutung ist dieselbe.

In diesem Sinne werden wir uns nicht auf Fehlermeldungen konzentrieren. Stattdessen werden wir die eigentliche Ursache des Problems (z. B. das Vergessen einer Klammer oder eines Anführungszeichens) herausfinden. Auf diese Weise lernen Sie, wie Sie das Problem von vornherein umgehen können.

Sind Sie bereit? Dann fangen wir an!

1. Offene und schließende Klammern zuerst setzen

Um unausgewogene Klammern, Anführungszeichen, doppelte Anführungszeichen oder eckige Klammern zu vermeiden, ist es wichtig, sich an das schließende Zeichen zu erinnern. Bewährte Verfahren empfehlen, beide Zeichen zuerst einzugeben (offenes und schließendes Zeichen) und dann das einzugeben, was darin steht.

Das folgende Beispiel zeigt einen Fehler, wenn die Klammern nicht ausgeglichen sind:

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 ;

Beispiel 1: Unausgewogene Klammern

2. Setzen Sie kein Komma am Ende einer Spalten- oder Tabellensequenz

Kommas dienen in SQL als Trennzeichen. Zwischen FROM und dem ersten Tabellennamen oder nach dem letzten Tabellennamen sollten keine Kommas stehen. Das Gleiche gilt für die Definition von Spalten: Wenn Sie eine Tabelle erstellen, achten Sie darauf, dass Sie kein zusätzliches Komma nach dem letzten Spaltennamen eingeben.

Dies ist ein sehr häufiger Fehler.

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

Beispiel 2: Ein zusätzliches Komma

3. Verwenden Sie die partielle Abfrageauswertung, um lange SQL-Abfragen zu debuggen

Viele SQL-Clients wie Navicat oder pgAdmin erlauben die teilweise Ausführung einer Abfrage. Sie können dies tun, indem Sie mit der Maus einen Teil des Codes markieren. Mit dieser Technik des Teilens und Eroberns können Sie Fehler leicht isolieren und beheben. Der markierte Teil muss natürlich gültiges SQL sein.

Die folgende Abfrage weist zwei Fehler auf. Wenn wir die erste Zeile der Abfrage ausführen, können wir das erste Problem erkennen. (Hinweis: Die Spalte "llastname" existiert nicht.)

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 

Beispiel 3: Ein falscher Spaltenname

Wenn wir jedoch die gesamte SQL-Anweisung ausführen, erhalten wir einen Fehler im Zusammenhang mit unausgewogenen Klammern:

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 ;

Beispiel 4: Unterabfrage mit falscher Klammerung

Wir können auch eine Unterabfrage markieren und sie einzeln ausführen, wie im nächsten Beispiel:

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

Beispiel 5: Falscher Funktionsname

4. Achten Sie auf Spalten- und Tabellennamen

Achten Sie sehr genau darauf, wenn Sie Spalten- oder Tabellennamen eingeben. Wenn möglich, versuchen Sie, den Namen aus einem Befehl zu kopieren und einzufügen, von dem Sie wissen, dass er korrekt ist - vorzugsweise einen, der bereits ordnungsgemäß ausgeführt wurde. Bewährte Verfahren empfehlen das Kopieren und Einfügen von Namen, auch wenn Sie glauben, dass dies zeitaufwändiger ist als das Eintippen.

Ein falsch geschriebener Spaltenname oder ein Verweis auf eine Spalte in einer Tabelle, die nicht in der FROM Klausel enthalten ist, kommt sehr häufig vor. Achten Sie immer auf Tippfehler im Spaltennamen, vergewissern Sie sich, dass die Tabelle in FROM diese Spalte hat, und stellen Sie sicher, dass die Tabelle in FROM erwähnt wird.

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

Beispiel 6: Falscher Tabellenname

Eine weitere gute Praxis ist die Verwendung eines Tabellenalias oder eines Tabellennamens als Spaltenpräfix. Dies ist doppelt wichtig, wenn Sie zwei oder mehr Tabellen in der <>FROM-Klausel haben. Der folgende Fehler kann auftreten, wenn Sie sich auf zwei identisch benannte Spalten in verschiedenen Tabellen beziehen:

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

Beispiel 7: Zweideutige Spaltennamen

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

Beispiel 8: Vorangestellte Spaltennamen

Um diese Fehler zu beheben, fügen Sie den Tabellennamen vor dem Spaltennamen ein. (Im obigen Beispiel wären das employee.depto_id und department.depto_id statt nur depto_id.)

5. Nur kompatible Datentypen vergleichen

Wenn Sie Vergleichsbedingungen in die WHERE Klausel schreiben, stellen Sie sicher, dass beide Datentypen mit dem Vergleichsoperator und miteinander kompatibel sind. Wenn dies nicht möglich ist, müssen Sie eventuell einen der Datentypen casten. In der Regel sollten Sie Zahlen mit Zahlen, Zeichenketten mit Zeichenketten usw. vergleichen.

Einige Datenbanksysteme konvertieren Datentypen automatisch, wo dies möglich ist; andere bieten erweiterte Datentypkonvertierungen (z. B. kann ein TIMESTAMP-Wert vor Vergleichen automatisch in ein DATE konvertiert werden). Wieder andere Datenbankdienste bieten überhaupt keine Konvertierungen an. Es ist also am besten, wenn Sie sich selbst um diese potenziellen Probleme kümmern.

Jedenfalls erhält der folgende SQL-Code einen Fehler bei der Datenübereinstimmung, weil ein CHAR-String mit einem Integer-Wert verglichen wird:

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

Beispiel 9: Nicht übereinstimmende Datentypen

Kein Operator entspricht dem angegebenen Namen und Argumenttyp(en). Möglicherweise müssen Sie explizite Typ-Casts hinzufügen, um dieses Problem zu lösen.

6. IS NULL beim Vergleich von NULL-Werten verwenden

Wenn Sie nur überprüfen müssen, ob eine Spalte einen NULL-Wert hat, achten Sie besonders darauf, welche Ausdrücke Sie verwenden. Ein häufiger Fehler ist es, = NULL oder <> NULL zu verwenden, aber diese Ausdrücke sind syntaktisch nicht gültig. Verwenden Sie stattdessen die Klauseln IS NULL und IS NOT NULL.

Schauen wir uns die falschen und richtigen Beispiele an:

SELECT firstname, lastname
FROM employee
WHERE depto_id = NULL

Beispiel 10: Falscher NULL-Vergleich

SELECT firstname, lastname
FROM employee
WHERE depto_id is NULL

Beispiel 11: Korrekter NULL-Vergleich

7. Immer die JOIN-Bedingung einbeziehen

Es gibt mehr als eine gültige Möglichkeit, eine Verknüpfung in SQL durchzuführen. Die herkömmliche Methode besteht darin, alle zu verknüpfenden Tabellen in der FROM-Klausel aufzulisten und die Verknüpfungsbedingungen in die WHERE-Klausel aufzunehmen, um Paare von Datensätzen zu bilden. Die andere (deklarativere) Methode besteht darin, die JOIN-Klausel zu verwenden und die Verknüpfungsbedingungen nach der ON-Klausel aufzuführen. Beide sind syntaktisch gleichwertig, aber Sie sollten wissen, wie Sie die Join-Bedingung für beide identifizieren können.

Hier haben wir zwei gültige Joins:

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

Beispiel 12: Zwei gleichwertige Joins

Der Tipp lautet jedoch: Vergessen Sie nicht die Join-Bedingung! Jedes Mal, wenn Sie zwei oder mehr Tabellen verbinden, müssen Sie eine Join-Bedingung schreiben, um beide Tabellen zu verknüpfen. Wenn Sie dies nicht angeben, erhalten Sie keine Fehlermeldung, sondern nur falsche Ergebnisse. Diese werden falsch sein, weil jeder Datensatz der ersten Tabelle mit allen Datensätzen der zweiten Tabelle verknüpft wird. Diese Art von Ergebnismenge wird als kartesisches Produkt zweier Tabellen bezeichnet und ist normalerweise kein erwartetes Ergebnis.

SELECT lastname, name 
FROM department, employee

Beispiel 13: Ein kartesisches Produkt - in der Regel nicht das gewünschte Ergebnis

8. Nicht aggregierte Spalten aus der SELECT-Liste in GROUP BY-Spalten einbeziehen

Bei der Verwendung von Aggregatfunktionen gibt es einige Einschränkungen, welche Spalten in die SELECT Liste (d.h. die Spaltennamen nach der SELECT Klausel) aufgenommen werden können. Sie können nur die in der Klausel GROUP BY angegebenen Spalten sowie Aggregatfunktionen und Konstanten einbeziehen. Wenn Sie nur Aggregatspalten auswählen, führt jede andere Spalte zu einem Fehler. Sie können dies im folgenden Beispiel sehen.

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

Beispiel 14: Zusätzliche Spalten in der SELECT-Liste

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

Beispiel 15: Keine zusätzlichen Spalten in der SELECT-Liste

Manchmal müssen wir Daten mit Hilfe einer Aggregationsfunktion filtern. Einer der häufigsten Fehler besteht darin, eine Bedingung mit der Aggregatfunktion in die WHERE -Klausel zu setzen. Dies ist unten dargestellt:

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

Beispiel 16: Falsche Aggregatfunktion in der WHERE-Klausel

Denken Sie daran, wenn Sie mit Hilfe einer Aggregatfunktion filtern müssen, ist es richtig, die Bedingung mit Hilfe des Aggregats in die HAVING Klausel zu setzen, wie im folgenden Beispiel:

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

Beispiel 17: Die Aggregatfunktion steht in der HAVING-Klausel

Probieren Sie es selbst aus!

LearnSQL ist ein guter Ort, um mit SQL zu beginnen. Mehrere Kurse sind für Anfänger gedacht. Sie können die Tipps in diesem Artikel anhand der Übungen in diesem SQL-Kurs testen.