Du willst verstehen, wie der Computer SQL versteht?
Dann bist Du bei diesem Tutorial richtig!
Starten wir mit Parsing!
Was ist SQL?
SQL = Structured Query Language ist eine Datenbanksprache, mit dem Du Datenbanken mit Inhalten füllen, ändern und löschen kannst. SQL definiert z. B. Tabellen in einer Datenbank, manipuliert diese und verwaltet die Nutzer, die auf die Daten Zugreifen wollen.
Viele Web-Anwendungen und Apps verwenden Datenbanken im Hintergrund, um ihre Datenhaltung sicherzustellen. Statt die Daten im Hauptspeicher flüchtig zu speichern, speichert die Datenbank die Anwendungsdaten der Nutzer dauerhaft (persistent) und zuverlässig (integer, isoliert und atomar).

Datenbanken verhindern, dass Daten bei „Extremsituationen“ verschwinden:
- Stromausfall
- Überschreiben von Daten
- unberechtigte Änderungen,
- Datenzentrum brennt ab (Replikation)
- Softwarefehler
Datenbanken habe ein ganzes Arsenal an Sicherheits-Maßnahmen, damit Datenverlust keine Option ist.
Es gibt nicht das eine „SQL“, sondern es gibt in der Realität viele SQL-Dialekte. Nicht jede Datenbank unterstützt die gleichen Befehle oder benennt diese anders.
Was ist ein SQL Parser?
Parsen = Analysieren – das Datenbank-Programm analysiert die eigenen SQL-Befehle und interpretiert, was der Nutzer mit diesem Befehl meinen könnte.
Damit die Maschine, das macht, was der Nutzer möchte, muss der Nutzer eine strenge Struktur und Grammatik (Syntax) mit den richtigen Befehlen (Schlüsselworte) einhalten.

Jede Datenbank prüft vor der Eingabe, ob das SQL-Kommando richtig geschrieben wurde und führt nur aus, wenn alle Angaben korrekt erscheinen. Gefährlich wird es, wenn der Nutzer Änderungen auf der Tabelle ohne Limitierungen ausführt (fehlende WHERE-Bedingungen). Die Datenbank macht alles, was im Code steht und nicht was der Nutzer meint zu tun.
Compiler vs. Parser
Ein Compiler ist ein Programm, welches Quellcode (Programmiercode) in eine für die Maschine verständliches Format übersetzt. Entwickler verwenden nicht eine Maschinensprache, weil diese sehr unübersichtlich und unbequem zu programmieren ist. Quellcode wie Golang oder Java sind der natürlichen Sprache ähnlicher und kommen mit weniger Text aus.
Beispiel: Natürlichere Sprache mit Golang um Spalten in einer Matrix auszuwählen:
func SelectColumns(arr [][]string, indices []int) [][]string {
result := make([][]string, len(arr))
for i, row := range arr {
selected := []string{}
for _, col := range indices {
if col < len(row) {
selected = append(selected, row[col])
}
}
result[i] = selected
}
return result
}
Ein Compiler baut aus viele Quelldateien ein Programm zusammen und fügt die Bibliotheken von dritten Entwicklern hinzu (Libraries).
Ein Parser ist ein Bestandteil eines Compilers. Die Programmiersprache gibt eine feste Syntax vor, die die Programmierer einhalten müssen. Weichen die Programmierer ab, meldet der Parser einen Fehler und das Programm, wird nicht zu Ende gebaut.
Assembler (Als Zwischenstufe)
push rbp
mov rbp, rsp
sub rsp, 12
Maschinencode als Hexadezimal
55
48 89 E5
48 83 EC 12
Ein Parser bzw. Compiler prüft nicht den Sinn eines Programms – eine Software, die wir parsen und kompilieren können, ist nicht immer fehlerfrei. Der Computer macht nur den Quatsch, der im Code steht (Logikfehler werden übersehen).
SQL Parser verstehen
Ein SQL-Skript besteht aus mehreren SQL-Statements bzw. Sätzen / Anweisungen. Die Anweisungen sind mit Semikolons ; voneinander getrennt. Die Datenbank arbeitet Anweisung für Anweisung ab, weil diese eine geschlossene Operation darstellt. Du dürftest alle Anweisungen in eine Zeile klatschen oder 1000 Zeilenumbrüche erstellen. Dem Parser darf das nicht stören.
Select with WHERE
SELECT first_name, last_name
FROM employees
WHERE department = 'Sales';
Eine Anweisung beinhaltet die Schlüsselwörter wie SELECT, UPDATE, DELETE, FROM usw. Jedes Schlüsselwort sollte der Programmierer in Großbuchstaben schreiben, während die Spalten- und Tabellennamen in Kleinbuchstaben geschrieben werden.
Insert Data
INSERT INTO customers (customer_id, name, email)
VALUES (101, 'Alice Johnson', 'alice@example.com');
Wir halten es in diesem Tutorial einfach und betrachtet nicht verschachtelte Anfragen oder JOINs. Ein ungefährer Ablauf für die Prozessierung eines SQL-Skripts teilt sich in diese 7 Schritte:
1. Erst hacken – Aufteilen in Anweisungen
Das Semikolon zerteilt das Skript in Anweisungen:
CREATE TABLE suppliers (
supplier_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
contact_email VARCHAR(100),
country VARCHAR(50)
);
CREATE TABLE artists (
artist_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
);
2. Noch feiner hacken – Aufteilen in Tokens
Jedes nicht Wort-Character (Symbol / Buchstabe) gilt als Separator. Der Programmierer darf unendlich viele Leerzeichen oder Absätze in seine Anweisung einbauen. Diese sollte der Parser überspringen und in einen Array schreiben. Eine Klammer auf / zu sollte ein selbständiger Token sein
[CREATE,TABLE,suppliers,(,supplier_id,...
3. Divide et Impera – Subroutinen bauen
Jedes Schlüsselwort zu Beginn bestimmt eine Subroutine. Wenn wir eine SELECT haben führen wir eine Datenabfrage aus, wenn eine CREATE TABLE zu Beginn steht, bauen wir eine Routine für eine Tabellenerstellung. Einige Schlüsselworte kommen häufiger vor: WHERE, FROM usw. diese dürfen wir als Funktion wiederverwenden.
INSERT INTO --> Starte Subroutine Einfügen
customers --> Suche die Tabelle customers
(customer_id, name, email) --> Welche Spalten möchte ich einfügen
VALUES --> Achtung jetzt kommt die Werte
(101, 'Alice Johnson', 'alice@example.com'); --> Werte auf Spaltenart prüfen
--> Einfügen der Daten und ein ok zurückgeben
4. Wer bist Du? – Token in Arten teilen
Jedes SQL-Statement kann aus Spaltennamen, Schlüsselworten, Operatoren und Werte bestehen. Wir dürfen nicht Spaltennamen mit Schlüsselwörtern verwechseln und prüfen, ob der Nutzer eine Spalte mit dem Namen SELECT erstellt.
Technisch könnte der Parser alles verstehen, aber für den Menschen sind solche Statements nicht lesbar. Konventionen wie Absätze, Groß- und Kleinschreibung, sprechende Benennung helfen den Programmierern enorm.
INSERT INTO --> Schlüsselwort
customers --> Tabellennamen
(customer_id, name, email) --_> Spaltennamen
VALUES --> Schlüsselwort
(101, --> INT
'Alice Johnson',--> STRING
'alice@example.com');- -> STRING
5. Rechnen und Verschieben – Subroutinen ausführen
Jetzt wirds kompliziert: Jedes Schlüsselwort bekommt eine Funktion, die die Operation auf den Daten ausführt. Bei einem SELECT werden Daten aus einer Tabelle extrahiert und gegebenenfalls modifiziert (z.B. summiert)
SELECT first_name, last_name --> Bitte nur die Spalte first_name und last_name
FROM employees --> Suche die Tabelle employees
WHERE department = 'Sales'; --> Reduziere die Tabelle bitte nur auf alle Personen in der Abteilung Sales
6. Fertig? – Rückgabe erzeugen
Die Operation ist fertig, jetzt müssen wir die Daten zurückgeben. Das kann über ein REST-Interface im CSV-, JSON– oder MariaDB-TCP-Format erfolgen.
Der Nutzer interessiert sich nicht nur für die rohen Daten, sondern auch für die Spaltennamen, Abfragezeiten, Fehlermeldungen und die Anzahl der Ergebnisse.










Schreibe einen Kommentar