Tutorial zu SQL-Unterabfragen: Typen, korrelierte Unterabfragen und EXISTS mit Beispielen
Eine Unterabfrage ist eine Abfrage innerhalb einer anderen Abfrage. Lernen Sie jeden Typ kennen und wissen Sie, wo er passt, verstehen Sie korrelierte Unterabfragen richtig und vermeiden Sie die NOT IN-Falle, die stillschweigend überhaupt keine Zeilen zurückgibt.
- Eine Unterabfrage ist eine in einer anderen verschachtelte Abfrage, und die äußere Abfrage verwendet ihr Ergebnis.
- Unterabfragen können in
WHERE,FROM,SELECTundHAVINGerscheinen. - Eine korrelierte Unterabfrage bezieht sich auf die äußere Zeile, sodass sie logisch pro Zeile ausgewertet wird.
- Bevorzugen Sie
NOT EXISTSgegenüberNOT IN, wenn NULL-Werte möglich sind.
Die Beantwortung einiger Fragen erfordert zwei Schritte. „Welche Bestellungen liegen über dem Durchschnitt?“ erfordert, dass Sie zuerst den Durchschnitt ermitteln und dann jede Bestellung damit vergleichen. SQL-Unterabfragen ermöglichen es Ihnen, beide Schritte als eine Anweisung zu schreiben.
In diesem Tutorial wird jeder Typ anhand von zwei kleinen Tabellen behandelt. Wir haben diese Abfragen in SQLite 3.50 ausgeführt und die angezeigten Ergebnisse stammen aus diesem Lauf. Die Standard-Unterabfragesyntax wird weitgehend unterstützt und wir weisen auf die Stellen hin, an denen sich die Datenbanken unterscheiden.
Was ist eine Unterabfrage?
Eine Unterabfrage, auch innere oder verschachtelte Abfrage genannt, ist eine SELECT-Anweisung, die in runden Klammern in eine andere Anweisung eingefügt wird. Konzeptionell erzeugt die innere Abfrage ein Ergebnis, das dann von der äußeren Abfrage verwendet wird.
SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);
Die Beispieltabellen
CREATE TABLE customers (id INT, name TEXT, city TEXT);
CREATE TABLE orders (id INT, customer_id INT, total INT);
INSERT INTO customers VALUES
(1,'Asha','Pune'), (2,'Ben','Delhi'), (3,'Chitra','Pune'), (4,'Dev','Goa');
INSERT INTO orders VALUES
(101,1,1200), (102,1,800), (103,2,300), (104,3,2500), (105,3,100);
Beachten Sie, dass Dev keine Befehle hat. Dieses Detail ist für mehrere Beispiele unten wichtig.
Arten von Unterabfragen im Überblick
| Typ | Rückgaben | Typischer Standort | Gemeinsame Operatoren |
|---|---|---|---|
| Skalar | Ein Wert | WHERE, SELECT |
=, >, < |
| Mehrreihig | Eine Spalte, viele Zeilen | WO |
IN, ANY, ALL |
| Tabelle (abgeleitet) | Viele Spalten und Zeilen | VON |
Wird wie ein Tisch verwendet |
| Korreliert | Hängt von der äußeren Reihe ab | WHERE, SELECT |
Beliebig und EXISTS |
Skalare Unterabfragen
Eine skalare Unterabfrage gibt genau einen Wert zurück, sodass Sie sie überall dort verwenden können, wo ein einzelner Wert sinnvoll ist. Hier ist die Abfrage von vorhin mit ihrem Ergebnis. Der Durchschnitt aller Bestellungen liegt bei 980:
SELECT id, total
FROM orders
WHERE total > (SELECT AVG(total) FROM orders);
-- 101 | 1200
-- 104 | 2500
Sie konnten WHERE total > AVG(total) nicht schreiben, da Aggregate in WHERE nicht direkt erlaubt sind. Die Unterabfrage umgeht dies, indem sie den Wert separat berechnet.
Was passiert, wenn eine „skalare“ Unterabfrage mehrere Zeilen zurückgibt? Die meisten Datenbanken, einschließlich PostgreSQL, MySQL und SQL Server, lösen einen Fehler aus. SQLite nicht. In unserem Test wurde stillschweigend nur die erste Zeile verwendet, was einen echten Fehler verbergen könnte. Verlassen Sie sich also nicht auf dieses Verhalten.
IN und NICHT IN
Wenn die innere Abfrage eine Liste zurückgibt, verwenden Sie IN. Dadurch werden Kunden mit mindestens einer Bestellung über 1000 gefunden:
SELECT name FROM customers
WHERE id IN (SELECT customer_id FROM orders WHERE total > 1000);
-- Asha
-- Chitra
NOT IN macht das Gegenteil und findet Kunden, die noch nie bestellt haben:
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM orders);
-- Dev
Das funktioniert hier, aber NOT IN hat einen gefährlichen Randfall, den wir weiter unten behandeln.
Unterabfragen in FROM
Eine Unterabfrage in FROM fungiert als temporäre Tabelle, die oft als abgeleitete Tabelle bezeichnet wird. Dies ist nützlich, wenn Sie zwei Aggregationen durchführen müssen, wie in dieser Abfrage für die durchschnittlichen Ausgaben pro Kunde in jeder Stadt:
SELECT city, AVG(spent) AS avg_spent
FROM (
SELECT c.city, SUM(o.total) AS spent
FROM customers c
JOIN orders o ON o.customer_id = c.id
GROUP BY c.id, c.city
) AS per_customer
GROUP BY city;
-- Delhi | 300.0
-- Pune | 2300.0
Die innere Abfrage summiert jeden Kunden und die äußere ermittelt den Durchschnitt dieser Summen. Es ist eine gute Angewohnheit, der abgeleiteten Tabelle einen Alias zu geben, da einige Datenbanken dies erfordern. Wenn GROUP BY für Sie neu ist, lesen Sie SQL GROUP BY und HAVING.
Unterabfragen in SELECT
Eine skalare Unterabfrage kann auch eine berechnete Spalte hinzufügen. Dieser zählt Bestellungen pro Kunde:
SELECT name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.id) AS order_count
FROM customers c;
-- Asha | 2
-- Ben | 1
-- Chitra | 2
-- Dev | 0
Dev erscheint mit Null. Ein innerer Join hätte Dev komplett gelöscht, da Dev keine passenden Zeilen hat. Das gleiche Ergebnis könnten Sie mit LEFT JOIN und GROUP BY erzielen, was wir unter Erklärte SQL-Joins erläutern.
Korrelierte Unterabfragen
Das vorherige Beispiel ist ebenfalls korreliert, da die innere Abfrage auf c.id aus der äußeren Abfrage verweist. Eine nicht korrelierte Unterabfrage kann alleine ausgeführt werden. Eine Korrelation kann nicht erfolgen, da sie von einem Wert aus der aktuellen äußeren Zeile abhängt.
Dadurch werden Bestellungen gefunden, die über dem Durchschnitt desselben Kunden liegen:
SELECT o.id, o.customer_id, o.total
FROM orders o
WHERE o.total > (
SELECT AVG(i.total)
FROM orders i
WHERE i.customer_id = o.customer_id
);
-- 101 | 1 | 1200
-- 104 | 3 | 2500
So lesen Sie es. Für Bestellung 101 ermittelt die innere Abfrage den Durchschnitt der Bestellungen von Kunde 1 (1200 und 800), was 1000 ergibt. Da 1200 größer ist, wird die Zeile beibehalten. Für die Ordnung 102 gilt der gleiche Durchschnitt, aber 800 ist nicht größer und wird daher weggelassen. Die Einzelbestellung von Kunde 2 entspricht seinem eigenen Durchschnitt und wird daher ebenfalls verworfen.
| Funktion | Nicht korreliert | Korreliert |
|---|---|---|
| Verwendet äußere Abfragewerte? | Nein | Ja |
| Kann alleine laufen? | Ja | Nein |
| Logische Ausführung | Einmal | Einmal pro äußerer Reihe |
| Leistungsrisiko | Normalerweise niedrig | Kann auf großen Tischen hoch stehen |
„Einmal pro Zeile“ beschreibt die Logik, und Abfrageoptimierer schreiben diese häufig in etwas weitaus effizienteres um. Dennoch lohnt es sich, eine langsame korrelierte Unterabfrage zu untersuchen. Ein Index auf der inneren Spalte, hier orders.customer_id, kann einen großen Unterschied machen. Siehe Erklärte SQL-Indizes.
EXISTIERT und NICHT EXISTIERT
EXISTS stellt eine Ja- oder Nein-Frage: Gibt die innere Abfrage mindestens eine Zeile zurück? Es kann beim ersten Treffer aufhören, und was Sie darin auswählen, spielt keine Rolle, weshalb die Leute oft schreiben SELECT 1.
SELECT c.name FROM customers c
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Asha, Ben, Chitra
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.id);
-- Dev
Die NOT IN NULL-Falle
Dies ist einer der häufigsten Unterabfragefehler. Wir haben eine Tabelle mit einer echten ID und einem NULL-Wert erstellt und dann beide Formen dagegen ausgeführt:
CREATE TABLE r (customer_id INT);
INSERT INTO r VALUES (1), (NULL);
SELECT name FROM customers
WHERE id NOT IN (SELECT customer_id FROM r);
-- (no rows at all)
SELECT c.name FROM customers c
WHERE NOT EXISTS (SELECT 1 FROM r WHERE r.customer_id = c.id);
-- Ben, Chitra, Dev
Warum gibt das erste nichts zurück? id NOT IN (1, NULL) bedeutet id <> 1 AND id <> NULL. Jeder Vergleich mit NULL ist eher unbekannt als wahr, sodass die gesamte Bedingung niemals wahr sein kann. Es gibt keine Fehlermeldung und keine Warnung, sondern nur ein leeres Ergebnis, das plausibel aussieht.
Tipp: Verwenden Sie standardmäßig NOT EXISTS für Anti-Joins. Wenn Sie NOT IN verwenden, fügen Sie WHERE customer_id IS NOT NULL in die Unterabfrage ein.
Unterabfrage vs. JOIN vs. CTE
Viele Abfragen können auf mehr als eine Weise geschrieben werden. Früher haben wir mit IN Kunden mit einem Großauftrag gefunden. Hier ist das gleiche Ergebnis mit einem Join:
SELECT DISTINCT c.name FROM customers c
JOIN orders o ON o.customer_id = c.id AND o.total > 1000;
-- Asha
-- Chitra
Beachten Sie die DISTINCT. Ein Join kann Duplikate erzeugen, wenn ein Kunde mehrere Übereinstimmungen hat, während IN und EXISTS dies nicht können.
| Benutzen | Wann |
|---|---|
| TRETEN SIE MIT | Sie benötigen Spalten aus beiden Tabellen |
| IN oder EXISTS | Sie müssen nur danach filtern, ob eine Übereinstimmung vorhanden ist |
| Abgeleitete Tabelle | Sie müssen zuerst aggregieren, und es bleibt kurz |
| CTE | Die Logik besteht aus mehreren Schritten oder wird mehr als einmal verwendet |
| Fensterfunktion | Neben jeder Reihe benötigen Sie eine Figur pro Gruppe |
Die Leistung variiert je nach Datenbank und Daten, und moderne Optimierer erstellen oft ähnliche Pläne. Wählen Sie also zuerst die klarste Form und prüfen Sie dann EXPLAIN, ob sie langsam ist.
Häufige Fehler
- Verwenden Sie
=mit einem mehrzeiligen Ergebnis. Verwenden SieINoder stellen Sie sicher, dass die innere Abfrage eine Zeile zurückgibt. - Verwendung von
NOT INfür eine Spalte, die NULL-Werte zulässt. Sie können stillschweigend jede Zeile verlieren. - Verwendung unklarer Aliase. Qualifizieren Sie bei korrelierten Abfragen jede Spalte, da sie sonst möglicherweise an die falsche Tabelle gebunden wird.
- Tiefe Verschachtelung. Drei Ebenen sind schwer zu lesen, also konvertieren Sie sie in CTEs.
- Hinzufügen von
ORDER BYim Inneren. Es hat normalerweise keine Auswirkung auf das äußere Ergebnis und einige Datenbanken lehnen es ab.
Fazit
Unterabfragen sind eine natürliche Möglichkeit, zweistufige Fragen auszudrücken. Beginnen Sie mit skalaren Unterabfragen und IN und üben Sie dann korrelierte Unterabfragen, indem Sie jeweils eine einzelne äußere Zeile durchgehen. Und denken Sie an NOT EXISTS, wann immer NULL-Werte möglich sind. Schreiben Sie zum Üben eine Frage auf drei Arten, mit einer Unterabfrage, einem Join und einem CTE, und vergleichen Sie die Ergebnisse und die Lesbarkeit.
Häufige Fragen
Was ist eine Unterabfrage in SQL?
Eine Unterabfrage ist eine SELECT-Anweisung, die in Klammern in einer anderen SQL-Anweisung verschachtelt ist. Die äußere Anweisung verwendet ihr Ergebnis als Wert, Liste oder Tabelle.
Was ist eine korrelierte Unterabfrage?
Es handelt sich um eine Unterabfrage, die auf eine Spalte der äußeren Abfrage verweist. Es hängt von der aktuellen äußeren Zeile ab und kann daher nicht alleine ausgeführt werden.
Was ist schneller, eine Unterabfrage oder ein JOIN?
Es hängt von der Datenbank und den Daten ab, und Optimierer erstellen häufig ähnliche Pläne. Schreiben Sie zuerst die klarste Version und vergleichen Sie dann die Ausführungspläne, wenn es auf die Leistung ankommt.
Was ist der Unterschied zwischen IN und EXISTS?
IN vergleicht einen Wert mit einer Ergebnisliste. EXISTS prüft, ob überhaupt eine Zeile zurückgegeben wird. Bei NULL-Werten verhalten sie sich anders, wenn sie negiert werden.
Kann eine Unterabfrage mehrere Spalten zurückgeben?
Ja, wenn es in FROM als abgeleitete Tabelle verwendet wird, und einige Datenbanken erlauben auch Zeilenvergleiche. Eine skalare Unterabfrage muss nur eine Spalte und eine Zeile zurückgeben.
Lerne weiter
Benötigen Sie Hilfe beim Testen, WordPress oder SEO?
Wir helfen Teams, bessere Software zu liefern und ihre Websites zu erweitern. Sagen Sie uns, woran Sie gerade arbeiten, und wir schlagen Ihnen einen klaren nächsten Schritt vor.
Weitere Anleitungen finden Sie unter Tests, KI und moderne Entwicklung
Hat Ihnen dieser Artikel gefallen? Wählen Sie ein Thema und springen Sie direkt in unsere neuesten Tutorials.
KI-Halluzinationen erklärt: Warum Sprachmodelle Dinge erfinden und wie man sie reduziert
KI-Halluzinationen erklärt: Was sie sind, warum Sprachmodelle sie produzieren, gängige Typen, wie man sie mit Erdung und Eingabeaufforderungen reduz…
Artikel lesen →DevOpsErklärte Umgebungsvariablen: .env-Dateien, Geheimnisse und Konfiguration richtig gemacht
Umgebungsvariablen anhand von Python-Beispielen erklärt, die wir ausgeführt haben: Sie lesen und festlegen, warum jeder Wert ein String ist, .env-Da…
Artikel lesen →SoftwareentwicklungAPI-Ratenbegrenzung erklärt: Algorithmen, Header und Behandlung von 429-Fehlern
API-Ratenbegrenzung anhand einer von uns durchgeführten Simulation erklärt: Token-Bucket, festes Fenster, gleitendes Fenster, 429 Antworten, Ratenbe…
Artikel lesen →TestautomatisierungSpott in Python: unittest.mock, Patch und die Fehler, die Tests zum Lügen machen
Mocking in Python mit unittest.mock, getestet: Mock und return_value, side_effect, Patchen, wo ein Name verwendet wird, Spezifikation und Autospec, …
Artikel lesen →SoftwaretestsCode-Abdeckung erklärt: Leitungs- und Zweigstellenabdeckung und was 100 % wirklich bedeutet
Erklärung der Codeabdeckung anhand eines echten Coverage.py-Laufs: Zeilen-, Zweig- und Bedingungsabdeckung, Lesen eines Berichts, warum bei 100 % Ab…
Artikel lesen →Datenbanken & SQLDELETE vs. TRUNCATE vs. DROP in SQL: Unterschiede, Rollback und Verwendungszweck
DELETE vs. TRUNCATE vs. DROP erklärt mit getestetem SQL: was jeweils entfernt wird, Rollback, Trigger, Identitätsrücksetzung, Geschwindigkeit und wi…
Artikel lesen →Datenbanken & SQLErklärte SQL-Ansichten: Erstellen, nutzen und vermeiden Sie Fallstricke mit Beispielen
SQL-Ansichten anhand der von uns ausgeführten Abfragen erklärt: Erstellen einer Ansicht, Live-Ergebnisse, Ausblenden von Spalten, Leistung, aktualis…
Artikel lesen →SoftwareentwicklungTypeScript-Schnittstelle vs. Typ: Echte Unterschiede, getestet mit dem Compiler
TypeScript-Schnittstelle vs. Typ, überprüft mit dem echten Compiler: Was beide können, was nur einer kann, Deklarationszusammenführung, Erweiterunge…
Artikel lesen →SoftwareentwicklungPython *args und **kwargs erklärt: Flexible Funktionen mit klaren Beispielen
Python *args und **kwargs erklärt mit Code, den wir ausgeführt haben: Packen und Entpacken, Parameterreihenfolge, Nur-Schlüsselwort- und Nur-Positio…
Artikel lesen →SoftwareentwicklungPython-Lambda-Funktionen: Syntax, tatsächliche Verwendung und wann man sie nicht verwendet
Python-Lambda-Funktionen erklärt mit Code, den wir ausgeführt haben: Syntax, Sortierung mit Schlüssel, Karte und Filter, Abschlüsse, die Late-Bindin…
Artikel lesen →Künstliche IntelligenzWas sind KI-Agenten? Wie sie funktionieren, mit einer einfachen Agentenschleife, die Sie ausführen können
Was sind KI-Agenten? Eine einfache Anleitung zur Agentenschleife, zu Tools, Speicher und Leitplanken, mit einer kleinen Python-Schleife, die wir aus…
Artikel lesen →DevOpsÜberwachung vs. Beobachtbarkeit: Der wahre Unterschied, mit Protokollen, Metriken und Traces
Überwachung vs. Beobachtbarkeit erklärt: bekannte und unbekannte Fehler, Protokolle, Metriken und Spuren, eine exemplarische Vorgehensweise für Chec…
Artikel lesen →DevOpsDocker-Volumes vs. Bind Mounts: Containerdaten auf die richtige Art und Weise beibehalten
Docker-Volumes vs. Bind-Mounts erklärt: Warum Containerdaten verschwinden, benannte Volumes, Bind-Mounts, tmpfs, Compose-Beispiele, Backups, Berecht…
Artikel lesen →TestautomatisierungTDD vs. BDD: Hauptunterschiede, eine Funktion, die auf beide Arten entwickelt wurde und wann sie jeweils verwendet werden sollte
TDD vs. BDD erklärt mit einer Rabattfunktion, die in beide Richtungen aufgebaut ist: Rot-Grün-Refaktor mit Code, den wir ausgeführt haben, Gegeben-W…
Artikel lesen →SoftwaretestsBenutzerakzeptanztests (UAT): Prozess, Checkliste und reale Beispiele
Benutzerakzeptanztests erklärt: Wer führt ihn durch, wie unterscheidet er sich von der Qualitätssicherung, ein siebenstufiger Prozess, eine UAT-Test…
Artikel lesen →Datenbanken & SQLErklärte SQL-NULL-Werte: IS NULL, COALESCE, NULLIF und die zu vermeidenden Fallen
SQL-NULL-Werte, die mit von uns ausgeführten Abfragen erklärt wurden: dreiwertige Logik, IS NULL, COALESCE, NULLIF, wie Aggregate, Joins und Sortier…
Artikel lesen →Datenbanken & SQLSQL CASE WHEN-Anweisung: Syntax, reale Beispiele und häufige Fehler
SQL CASE WHEN anhand der von uns ausgeführten Abfragen erklärt: einfache und durchsuchte Formulare, Bedingungsreihenfolge, Pivots mit SUM, COUNT-Tri…
Artikel lesen →SoftwareentwicklungWas ist JWT? JSON-Web-Tokens anhand eines funktionierenden Beispiels erklärt
Was ist JWT? JSON Web Tokens erklärt: die drei Teile, ein Token, das in dem von uns ausgeführten Code erstellt und manipuliert wurde, JWT vs. Sitzun…
Artikel lesen →SoftwareentwicklungErklärte JavaScript-Ereignisschleife: Aufrufstapel, Mikrotasks und Timer mit Beispielen
Die JavaScript-Ereignisschleife wurde mit dem von uns ausgeführten Code erklärt: Aufrufstapel, Aufgaben- und Mikrotask-Warteschlangen, warum setTime…
Artikel lesen →SoftwareentwicklungErklärung von Python-Generatoren und -Ertrag: Sparen Sie Speicher mit echten Beispielen
Python-Generatoren und Yield anhand des von uns ausgeführten Codes erklärt: wie sie angehalten und fortgesetzt werden, gemessene Speichereinsparunge…
Artikel lesen →Künstliche IntelligenzWas sind Einbettungen? Vektoren und Kosinusähnlichkeit einfach erklärt
Was sind Einbettungen? Ein Leitfaden in einfacher Sprache zu Vektoren, Kosinusähnlichkeit und semantischer Suche, mit einem kleinen Beispiel, das wi…
Artikel lesen →DevOpsBlau-Grün vs. Canary-Bereitstellung: Unterschiede, Kompromisse und Auswahl
Blue-Green vs. Canary-Bereitstellung erklärt: Funktionsweise, Kosten, Risiko und Rollback, stabiles Benutzer-Bucketing, das wir getestet haben, Date…
Artikel lesen →TestautomatisierungFlaky-Tests: Was sie verursacht und wie man sie endgültig behebt
Flaky-Tests wurden anhand von Demos erklärt, die wir durchgeführt haben: die Hauptursachen, wie man sie bestätigt und diagnostiziert, richtige Korre…
Artikel lesen →SoftwaretestsLasttest vs. Stresstest: Unterschiede, Metriken und k6-Beispiele
Erläuterungen zu Lasttests und Stresstests: Was die einzelnen Tests beweisen, Spike- und Soak-Tests, welche Kennzahlen wichtig sind, warum Durchschn…
Artikel lesen →SoftwaretestsTestfall vs. Testszenario: Hauptunterschiede, Beispiele und wann man sie jeweils verwendet
Testfall vs. Testszenario erklärt: klare Definitionen, eine Tabelle nebeneinander, eine Funktion zum Zurücksetzen von Passwörtern, die von Szenarios…
Artikel lesen →Datenbanken & SQLSQL-Abfrageoptimierung: Ausführungspläne lesen und langsame Abfragen mit Zeitvorgaben beheben
An einer Million Zeilen getestete SQL-Abfrageoptimierung: Ausführungspläne lesen, die richtigen Indizes hinzufügen, nicht sargierbare Filter korrigi…
Artikel lesen →Datenbanken & SQLSQL UNION vs. UNION ALL: Unterschiede, Beispiele und getestete Leistung
SQL UNION vs. UNION ALL anhand der von uns ausgeführten Abfragen erklärt: Duplikate, die Regeln, denen beide folgen, ein echter Datenfehler, gemesse…
Artikel lesen →SoftwareentwicklungTutorial zur JavaScript-Abruf-API: GET, POST, Fehlerbehandlung und Zeitüberschreitungen
Ein JavaScript-Abruf-API-Tutorial, das auf einem lokalen Server getestet wurde: GET und POST, warum 404 nicht ausgelöst wird, ein wiederverwendbarer…
Artikel lesen →SoftwareentwicklungUmgang mit Python-Dateien: Lesen, Schreiben, CSV, JSON und Pathlib mit Beispielen
Die Handhabung von Python-Dateien wird anhand des von uns ausgeführten Codes erklärt: Öffnungsmodi, Lesen großer Dateien, CSV, JSON, Pathlib, Binärd…
Artikel lesen →SoftwareentwicklungPython-Klassen und -Objekte: OOP-Tutorial mit echten Beispielen
Python-Klassen und -Objekte erklärt mit Code, den wir ausgeführt haben: __init__, Methoden, Klassen- und Instanzattribute, Vererbung, Eigenschaften,…
Artikel lesen →Künstliche IntelligenzWas ist ein großes Sprachmodell? Wie LLMs funktionieren, ohne großen Hype erklärt
Was ist ein großes Sprachmodell? LLMs im Klartext erklärt: Token, Einbettungen, Aufmerksamkeit, Training, Temperatur- und Kontextfenster, eine klein…
Artikel lesen →DevOpsLinux-Befehle für Anfänger: Der grundlegende Terminal-Leitfaden mit Beispielen
Linux-Befehle für Anfänger, gruppiert nach Aufgaben: Navigation, Dateien, Anzeigen von Protokollen, Grep, Pipes, Berechtigungen, Prozesse und Archiv…
Artikel lesen →TestautomatisierungSelenium vs. Playwright: Hauptunterschiede, Code im Vergleich und welche Sie wählen sollten
Selenium vs. Playwright im Vergleich: Architektur, Wartezeit, Browser- und Sprachunterstützung, Debugging, der gleiche Test in beiden Tools, Migrati…
Artikel lesen →SoftwaretestsÄquivalenzpartitionierung: Testdesigntechnik anhand von Beispielen erklärt
Erklärung der Äquivalenzpartitionierung: Wie man gültige und ungültige Partitionen findet, Beispiele für Alter, Passwörter und Gutscheine, von uns d…
Artikel lesen →SoftwaretestsSchweregrad vs. Priorität beim Softwaretest: Unterschiede, Matrix und reale Beispiele
Schweregrad vs. Priorität beim Softwaretest erklärt: klare Definitionen, eine Vier-Wege-Matrix mit Beispielen, Stufenskalen, wer die einzelnen Punkt…
Artikel lesen →Datenbanken & SQLTutorial zu SQL-Unterabfragen: Typen, korrelierte Unterabfragen und EXISTS mit Beispielen
Ein SQL-Unterabfrage-Tutorial mit Abfragen, die wir ausgeführt haben: Skalar-, IN-, FROM- und SELECT-Unterabfragen, korrelierte Unterabfragen, EXIST…
Artikel lesen →Datenbanken & SQLSQL-Transaktionen und ACID erklärt: COMMIT, ROLLBACK und Isolationsstufen
SQL-Transaktionen und ACID anhand einer von uns durchgeführten Banküberweisung erklärt: COMMIT, ROLLBACK, Sicherungspunkte, Sperren, Isolationsstufe…
Artikel lesen →SoftwareentwicklungGit merge vs rebase: Unterschiede, Beispiele und wann man was nutzt
Git merge vs rebase erklärt mit echter Log-Ausgabe, einer Vergleichstabelle, der goldenen Regel des Rebase und einem sicheren Team-Workflow.
Artikel lesen →SoftwareentwicklungPython List Comprehension: Syntax, Beispiele und wann man darauf verzichtet
Python List Comprehension erklärt: Syntax, Filter, if-else, verschachtelte Schleifen, gemessene Zeiten und Fälle, in denen eine normale for-Schleife…
Artikel lesen →Datenbanken & SQLSQL Joins erklärt mit Beispielen (Inner, Left, Right, Full)
SQL Joins Schritt für Schritt mit Beispieltabellen und Abfragen verstehen: INNER, LEFT, RIGHT, FULL, CROSS und SELF, plus typische Fehler und Perfor…
Artikel lesen →