Zurück zur Artikelliste Artikel
4 Leseminuten

Die nutzlosesten SQL-Abfragen (und was Sie stattdessen tun sollten)

Sie werden ausgeführt. Sie geben Daten zurück. Aber sie sind sinnlos. Hier erfahren Sie, was Sie nicht in SQL schreiben sollten - und was Sie stattdessen tun können.

Manche SQL-Abfragen laufen gut - aber das bedeutet nicht, dass sie etwas Sinnvolles tun.

In diesem Artikel werden wir echte Beispiele von SQL-Abfragen durchgehen, die gültig sind, harmlos aussehen und völlig sinnlos sind. Sie verschwenden Ressourcen, verbergen Erkenntnisse oder sind einfach nur störend. Für jede dieser Abfragen erfahren Sie, was falsch ist und wie Sie stattdessen eine intelligentere Alternative schreiben können.

Möchten Sie sofort üben, bessere Abfragen zu schreiben? Versuchen Sie den SQL-Praxis Track auf LearnSQL.de - er hilft Ihnen dabei, die Theorie in Können zu verwandeln, mit 12 Kursen und über 1000 interaktiven Übungen.

Lassen Sie uns mit dem Müll aufräumen und Abfragen schreiben, die die Aufgabe tatsächlich erfüllen.

1. Alles ohne Zweck auswählen

Die Abfrage:

SELECT * 
FROM orders;

Warum sie nutzlos ist: Sie zieht unnötige Daten, verlangsamt die Abfragen und belastet die Datenbank.

Was Sie stattdessen tun sollten: Geben Sie nur die erforderlichen Spalten an, um die Leistung zu verbessern.

Bessere Abfrage:

SELECT order_id, customer_id, total_amount
FROM orders;

2. Zählen von allem ohne Filterung

Die Abfrage:

SELECT COUNT(*) 
FROM orders;

Warum sie nutzlos ist: Sie liefert oft irreführende Erkenntnisse, wenn sie nicht gefiltert wird.

Was Sie stattdessen tun sollten: Verwenden Sie WHERE Bedingungen oder GROUP BY für eine bessere Genauigkeit.

Bessere Abfrage:

SELECT COUNT(*) 
FROM orders 
WHERE status = 'completed';

3. Standardmäßige Reihenfolge, wenn die Reihenfolge keine Rolle spielt

Die Abfrage:

SELECT total_amount 
FROM orders 
ORDER BY customer_id;

Warum sie nutzlos ist: Verlängert die Verarbeitungszeit, ohne die Analyse zu verbessern.

Was Sie stattdessen tun sollten: Verwenden Sie ORDER BY absichtpch, z. B. für Berichte oder zur Visuapsierung.

Bessere Abfrage: Verwenden Sie ORDER BY nur, wenn es notwendig ist;

SELECT total_amount 
FROM orders;

4. Sortieren ohne Limit

Diese Abfrage ist ähnlich wie die vorherige.

Die Abfrage:

SELECT order_id, customer_id, total_amount 
FROM orders 
ORDER BY created_at DESC;

Warum sie nutzlos ist: Das Sortieren großer Datensätze ohne Einschränkungen ist ineffizient.

Was stattdessen zu tun ist: Wenn möglich, verwenden Sie LIMIT oder TOP.

Bessere Abfrage:

SELECT order_id, customer_id, total_amount 
FROM orders 
ORDER BY created_at 
DESC LIMIT 10;

5. Gruppierung ohne aussagekräftige Bezeichnungen

Die Abfrage:


SELECT customer_id, COUNT(*) 
FROM orders 
GROUP BY customer_id;

Warum sie nutzlos ist: IDs allein bieten keinen Kontext - die Ergebnisse sind schwer zu interpretieren und nicht umsetzbar.

Was Sie stattdessen tun sollten: Stellen Sie sicher, dass Sie eine aussagekräftige Bezeichnung wie Name oder E-Mail angeben.

Bessere Abfrage:

SELECT o.customer_id, c.email, COUNT(*) AS total_orders 
FROM orders o 
JOIN customers c 
ON o.customer_id = c.id 
GROUP BY o.customer_id, c.email;

6. HAVING anstelle von WHERE zum Filtern von Zeilen verwenden

Die Abfrage:


SELECT order_id, customer_id, total_amount 
FROM orders 
HAVING total_amount > 100;

Warum es nutzlos ist: HAVING ist für Aggregatfilterung gedacht, nicht für Zeilenfilterung. Obwohl es technisch funktioniert, wird es den Leser der Abfrage davon ablenken, Ihre Absicht zu verstehen.

Was Sie stattdessen tun sollten: Verwenden Sie WHERE vor der Aggregation.

Bessere Abfrage:

SELECT order_id, customer_id, total_amount 
FROM orders 
WHERE total_amount > 100;

7. Filtern nach berechneten Spalten ohne Indizierung

Die Abfrage:

SELECT order_id, customer_id, total_amount 
FROM orders 
WHERE YEAR(created_at) = 2023;

Warum sie nutzlos ist: Verhindert die Verwendung von Indizes und verursacht vollständige Tabellenscans.

Was stattdessen zu tun ist: Verwenden Sie bereichsbasiertes Filtern, um Indizes zu nutzen.

Bessere Abfrage:

SELECT order_id, customer_id, total_amount 
FROM orders 
WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01';

8. Unterabfragen anstelle von Joins verwenden

Die Abfrage:


SELECT order_id, customer_id, total_amount  
FROM orders  
WHERE customer_id IN (SELECT customer_id FROM blacklisted_customers);

Warum sie nutzlos ist: kann im Vergleich zu JOINzu einer langsamen Leistung führen.

Was stattdessen zu tun ist: Verwenden Sie eine INNER JOIN oder LEFT JOIN.

Bessere Abfrage:

SELECT o.order_id, o.customer_id, o.total_amount  
FROM orders o  
JOIN blacklisted_customers b ON o.customer_id = b.customer_id;

9. Self-Joining anstelle der Verwendung von Fensterfunktionen

Die Abfrage:


SELECT
  o1.customer_id,
  o1.order_id,
COUNT(*) AS row_num  
FROM orders o1
JOIN orders o2
  ON o1.customer_id = o2.customer_id
  AND o1.order_date >= o2.order_date
GROUP BY o1.customer_id, o1.order_id;

Warum sie nutzlos ist: Sie verursacht unnötige Komplexität und Doppelarbeit.

Was stattdessen zu tun ist: Verwenden Sie Fensterfunktionen wie ROW_NUMBER(), RANK(), oder LAG().

Bessere Abfrage:

SELECT 
  customer_id, 
  order_id,  
  ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS row_num  
FROM orders;

Schreiben Sie intelligenteres SQL, nicht nur gültiges SQL

Nur weil eine Abfrage läuft, heißt das nicht, dass sie hilfreich ist. Wenn Sie diese häufigen Fallen vermeiden, wird Ihr SQL schneller, sauberer und viel nützlicher.

Wenn Sie weiter üben wollen, wie man Abfragen richtig schreibt, besuchen Sie den SQL-Praxis Track auf LearnSQL.de. Er ist vollgepackt mit praktischen Übungen, die Ihnen helfen, Ihre Fähigkeiten zu verbessern, indem Sie etwas tun - nicht nur lesen.