SQL (Structured Query Language) ist seit mehr als einem halben Jahrhundert bei uns und wird nicht so schnell verschwinden. SQL ist sowohl in traditionellen relationalen Datenbanken als auch in neueren NoSQL-Datenbanktechnologien beliebt und wird häufig für Datenanalysen, Big Data-Verarbeitung, Codierungssprachen und mehr verwendet.
Ich bin ein Fan von SQL. Es ist eine mächtige, aber einfache Sprache. In diesem Beitrag werde ich teilen:
- Die Macht von SQL und warum wir es verwenden
- Häufige Fallstricke und Best Practices
- Was ist SQL und warum sollten Sie es verwenden?
- Beispiele für SQL-Funktionen
- Empfohlene SQL-Codierungskonventionen (Benennung und mehr)
- Beispiele für SQL-Abfragen: Gut & Schlecht
- Fehlerbehebung bei SQL-Problemen – Fehler & Fallstricke
- Die erste Ursache für SQL–Fehler & Fehler – Nullwerte
- SQL-Indizes und -Partitionen werden Nicht verwendet
- Analysefunktionen Fallstricke in der SQL – Auswertungsreihenfolge
- SQL-Standardisierung
- Verhindern von SQL Injection (SQLi) –Angriffen
- Das Einwickeln von
Was ist SQL und warum sollten Sie es verwenden?
SQL wurde ursprünglich von IBM in den frühen 1970er Jahren entwickelt, später in diesem Jahrzehnt von Oracle übernommen und seitdem in relationalen Datenbanken verwendet. 1986 wurde SQL vom American National Standards Institute (ANSI) als Standard übernommen.
Da das Datenvolumen im Laufe der Zeit gewachsen ist, sind neue Datenbanken und Technologien entstanden. Eine davon ist Big Data, für Datensätze, die für traditionelle Datenverarbeitungsanwendungen zu komplex sind. Häufig in Big Data basieren NoSQL-Datenbanken nicht auf dem relationalen Modell. Sie werden manchmal nicht nur SQL genannt, um zu betonen, dass sie eine SQL-ähnliche Abfragesprache unterstützen können. Einige Beispiele für neuere nicht relationale Datenbanken und Bibliotheken, die SQL unterstützen, sind:
- Apache Spark Analytics Engine
- Google Big Query – verwaltetes Analytics Data Warehouse
- Facebook Presto und AWS Athena
- Elastische Suche
- Python-Datenanalysebibliothek (pandasql)
SQL wird sowohl in OLTP (Transaktionsverarbeitung) als auch in OLAP (analytische Verarbeitung) häufig verwendet, obwohl die beiden sehr unterschiedliche Anwendungsfälle sind:
Snippet 1: pandasql
Transaktionsverarbeitung | Analytische Verarbeitung | |
Allgemeine Verwendung | Relationale Datenbanken | Big Data-Datenbanken |
SQL-Verwendung | Einfügen, Aktualisieren und Abfragen von vielen Benutzern gleichzeitig | Abfragen auswählen. Nur wenige Abfragen gleichzeitig |
Berechnungsumfang | Klein | Groß – ganze Tabellen |
Abfragedauer | Schnell | Kann Stunden oder mehr betragen |
Leistungsbezogene Funktionen | Indizes und Schlüssel | Partitionen, redundante Daten (pro Anwendungsfall) |
Analytische Funktionen | Selten verwendet | Häufig |
Bevor Sie sich mit SQL befassen, finden Sie hier ein Beispiel für die SQL-Verwendung außerhalb von Datenbanken – Pythons Datenanalysebibliothek:
Code | Ausgabe |
|
Name COUNT(DISTINCT ID)0 James 11 John 22 Ted 1 |
Wie diese Beispiele zeigen, ist SQL in den neuesten und beliebtesten Technologien lebendig und gut.
Schauen wir uns seine Leistung genauer an.
Beispiele für SQL-Funktionen
Der stärkste Teil von SQL sind seine Funktionen. Hier sind die drei Arten von Funktionen, die SQL unterstützt:
Typ | Geltungsbereich | Reduzierung von Datensätzen | Beispiele |
Einfach | Einzelner Datensatz | Nein | CASE … WHEN 1 THEN column_1 WHEN 2 THEN column_2 ELSE 3 END |
Aggregiert (gruppiert nach) | Gruppe von Datensätzen | Ja | SUM(column_1) |
Analytisch | Gruppe von Datensätzen | Nein | SUM(column_1) OVER (PARTITION BY column_2) |
Wir empfehlen, die Funktionen Ihrer Abfrage-Engine durchzugehen, um ihre Funktionen zu verstehen. Hier finden Sie beispielsweise die Dokumentation von Presto zu Aggregatfunktionen und Analysefunktionen.
Empfohlene SQL-Codierungskonventionen (Benennung und mehr)
Um die Leistungsfähigkeit von SQL zu nutzen, empfehlen wir dringend die Verwendung von Codierungskonventionen. Dies verbessert sowohl das Schreiben als auch das Lesen und verbessert die Teamarbeit. Hier ist eine kurze Liste der wichtigsten:
Namen und Groß- / Kleinschreibung | Verwenden Sie Unterstriche, bei denen der Name natürlich ein Leerzeichen enthält (Nachname -> Nachname) Großbuchstaben für Schlüsselwörter und Funktionen (SELECT, FROM, WHERE, IN, SUM…) Kleinbuchstaben für alles andere: Variablen, Tabellennamen, Spalten usw. |
Verwenden Sie explizit die Schlüsselwörter | In Joins Verwenden Sie die Schlüsselwörter: CROSS, INNER… ON, LEFT… ON, RIGHT… ON Vermeiden Sie Joins als Teil der WHERE-Klausel: SELECT… FROM table_a, table_b WHERE… Aliasing – Immer das Schlüsselwort AS einschließen |
Vermeiden Sie verschachtelte Formulare, verwenden Sie stattdessen | Vermeiden Sie SELECT … FROM (SELECT …)
Verwenden Sie WITH Klauseln! Auf diese Weise können Sie komplexe Abfragen vermeiden und Schritt für Schritt lesbare Abfragen erstellen. |
Zeilenabstand | Vor UND/ODER nach jeder Schlüsselwortdefinition |
Include comments | Sowohl /* als auch /*/ und – sind akzeptabel |
Verwenden Sie nicht SELECT * | Ja, es ist kompakt und einfach, aber neue Spalten werden hinzugefügt und in Ihr Abfrageergebnis aufgenommen, ohne dass dies erforderlich ist. Schreiben Sie explizit den Spaltennamen, den Sie benötigen |
Beispiele für SQL-Abfragen: Gut & Schlecht
Um Ihnen zu zeigen, wie wichtig die Codierungskonventionen sind, sehen Sie sich bitte diese guten und schlechten Beispiele an.
Typ | Gut | Schlecht |
Flow | Zwei einfache Abfragen | Eine komplexe Abfrage |
Schlüsselwörter | Großbuchstaben | Kleinbuchstaben, wie anderer Text |
Join | Explizit – leicht zu verstehen | Implizit – mit anderen WHERE Prädikaten |
Einrückung | Zeilenabstand vor ODER hilft bei der Kenntnis seines Umfangs | Kein Zeilenabstand vor ODER. Größere Bedingung wird viel schwer zu verstehen sein |
Gebraucht | Nicht gebraucht |
Snippet 4: Schlechtes Beispiel
select emp.department, sum(exp.amount) expensesfrom employees emp, expenses expwhere emp.department in (select departmentfrom employeeswhere department like '%development%' or department like '%management%'group by departmenthaving count(distinct id) > 50) and emp.id = exp.employee_idgroup by emp.department
Snippet 5: Gutes Beispiel
-- filter: Development and Management departments with more than 50 employeesWITH dept AS (SELECT departmentFROM employeesWHERE department LIKE '%Development%'OR department LIKE '%Management%'GROUP BY departmentHAVING Count(DISTINCT id) > 50)-- find expenses for each of the filtered departmentsSELECT emp.department,SUM(exp.amount) AS expensesFROM employees AS empINNER JOIN deptON emp.department = dept.departmentINNER JOIN expenses AS expON emp.id = exp.employee_idGROUP BY emp.department
Hier ist ein nettes Online-Tool für die SQL-Formatierung, das Sie verwenden können: https://sqlformat.org/
Fehlerbehebung bei SQL-Problemen – Fehler & Fallstricke
Wie jede andere Sprache hat SQL seine eigenen Fallstricke, die Sie beachten sollten, um Zeit zu sparen und Fehler in Ihrer Anwendung zu vermeiden.
Die erste Ursache für SQL–Fehler & Fehler – Nullwerte
Snippet 6: NULL-Abfrageergebnis
SELECT NULL = NULL --> NULLSELECT NULL != NULL --> NULLSELECT NULL IS NULL --> trueSELECT 1 + NULL --> NULL SELECT SUM(num_column) WHERE FALSE --> NULL
Um dieses Problem zu beheben, sollten Sie Coalesce immer dann verwenden, wenn eine Gefahr besteht:
Snippet 7: Null in Joins überwinden
FROM t1INNER JOIN t2 ON COALESCE(t1.name, '') = COALESCE(t2.name, '')
SQL-Indizes und -Partitionen werden Nicht verwendet
Wir verbringen viel Zeit damit, unser Datenbankschema zu erstellen, indem wir Indizes hinzufügen und Partitionen deklarieren. Aber wir werden nicht die Leistung bekommen, die wir wollen, wenn wir dort aufhören — wir müssen sicherstellen, dass unsere Datenbank-Engine sie verwendet.
Angenommen, wir haben einen Index für die Spalte first_name:
|
Index nicht verwendet |
|
Verwendeter Index |
Es kann Änderungen von einer Implementierung zur anderen geben, aber das Konzept ist in jeder SQL-Implementierung gültig.
Wie stellen Sie sicher, dass Ihre Indizes und Partitionen verwendet werden? Analysieren Sie Ihren Abfrageausführungsplan. In einigen SQL-Implementierungen können Sie das Schlüsselwort EXPLAIN verwenden. In Oracle zum Beispiel heißt es EXPLAIN PLAN.
Analysefunktionen Fallstricke in der SQL – Auswertungsreihenfolge
Dies ist wichtig, wenn Sie eine Analysefunktion verwenden, da ein Missverständnis der Auswertungsreihenfolge zu Fehlern führen kann. Zum Beispiel:
Snippet 8: Analysefunktion mit Filter
SELECT first_name, last_name, department, COUNT(1) OVER (PARTITION BY department) AS size_of_departmentFROM employeesWHERE last_name LIKE 'A%'
Wir erhalten die Anzahl der Mitarbeiter in der Abteilung mit einem Nachnamen, der mit A beginnt, anstelle aller Mitarbeiter in der Abteilung. Denken Sie daran, dass Analysefunktionen zuletzt ausgeführt werden.
SQL-Standardisierung
Datums– und Uhrzeitsyntax, Nullen, Zeichenfolgenverkettung, Groß- und Kleinschreibung und andere Aspekte von SQL variieren von Anbieter zu Anbieter – was es schwierig macht, eine Anwendung zwischen Anbietern zu verschieben.
Versuchen Sie, nur Standard-SQL zu verwenden. Verwenden Sie beispielsweise COALESCE anstelle von ISNULL (SQL Server) oder NVL (Oracle).
Verhindern von SQL Injection (SQLi) –Angriffen
Eine bekannte Sicherheitslücke in Webanwendungen ist der SQL Injection-Angriff – eine Code-Injection-Technik, die Anwendungen angreift, indem Anweisungen zur Ausführung in ein Feld eingefügt werden. Solche Angriffe werden normalerweise verwendet, um Daten zu stehlen, Daten zu ändern oder Berechtigungen in der angegriffenen Datenbank zu ändern.
Das Verhindern von SQL-Injection-Angriffen beginnt während der Entwicklung und sollte durch die Verwendung von Scannern und Webanwendungs-Firewalls zum Schutz Ihrer Anwendung unterstützt werden. Beispiele und Möglichkeiten zur Verhinderung solcher Angriffe finden Sie im SQL Injection-Blogbeitrag.
Das Einwickeln von
SQL ist großartig. Ich persönlich bevorzuge SQL-basierte Sprache gegenüber jeder anderen Abfragesprache oder API. Sie müssen es jedoch richtig verwenden, um Ihre Arbeit zu erleichtern. Beginnen Sie mit der korrekten Erstellung Ihres Schemas und verwenden Sie später Codierungskonventionen und andere Optionen, z. B. die Funktionen WITH Schlüsselwort und Fenster.
Vergessen Sie nicht, die bekannten Fallstricke im Auge zu behalten. Und wenn Sie eine Anwendung schreiben, schützen Sie sie vor SQL-Injection.
Der Beitrag Einführung in SQL: Beispiele, Best Practices und Fallstricke erschienen zuerst auf Blog.
*** Dies ist ein syndizierter Blog des Security Bloggers Network von Blog, der von Ori Nakar verfasst wurde. Lesen Sie den Originalbeitrag unter: https://www.imperva.com/blog/introduction-to-sql-examples-best-practices-and-pitfalls/