Articles

Einführung in SQL: Beispiele, Best Practices und Fallstricke

Posted by admin

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?

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
import pandas as pdimport pandasql as psdata_frame = pd.DataFrame(, , , ], columns=)sql = """SELECT name, COUNT(DISTINCT id) FROM data_frame GROUP BY NAME """print(ps.sqldf(sql, locals()))
 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
GREATEST (column_1, column_2, column_3)
COALESCE (column_1)
Aggregiert (gruppiert nach) Gruppe von Datensätzen Ja SUM(column_1)
AVG(column_1)
Analytisch Gruppe von Datensätzen Nein SUM(column_1) OVER (PARTITION BY column_2)
LEAD/LAG - value of a field in the next or previous record

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:

SELECT first_nameFROM employeeWHERE UPPER(first_name) LIKE 'A%'
Index nicht verwendet
SELECT first_nameFROM employeeWHERE first_name LIKE 'A%' OR first_name LIKE 'a%'
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/

Related Post

Leave A Comment