SQL war eine der allerersten Programmiersprachen überhaupt, die ich in meiner noch Laufbahn als Programmierer Bekanntschaft machen durfte. In letzter Zeit habe ich mich insbesondere intensiv mit Microsoft's "Transact-SQL", auch bekannt als "T-SQL", auseinandergesetzt. Dabei wurde immer wieder erwähnt, dass gewisse Aspekte nur für diese Ausprägung von SQL gelten würden. Dies Aussage hat mich neugierig gemacht, was es denn für Varianten von SQL gibt und wo die Unterschiede liegen.
Standard
Unter SQL ("Structured Query Language") wird allgemein eine Sprache verstanden, welche es ermöglicht, mit (hauptsächlich) relationalen Datenbanken zu interagieren, also zum Beispiel um Daten aus Datenbanken auszulesen. Eine erste Version wurde in den 1970-er Jahren bei IBM entwickelt, und trug damals noch den Namen SEQUEL. Danach wurde die Entwicklung durch verschiedene Firmen schnell vorangetrieben, unter anderem Oracle, und entsprechend wurde SQL immer häufiger eingesetzt.
1989 wurde schliesslich ein erster Standard durch ANSI (American National Standards Institute) und ISO (International Organization for Standardization) erarbeitet. Dieser wurde seither mehrfach erweitert, zuletzt 2016.
Trotz des Standards gibt es jedoch eine sehr grosse Zahl an unterschiedlichen Versionen von SQL. Fast jedes RDBMS (Relational Database Management System) hat eine eigene Variante mit mehr oder weniger Unterschieden zum ANSI/ISO-Standard. Gründe dafür gibt es verschiedene: Einer mag sein, dass der Standard sehr umfassend ist. Einige Hersteller haben deshalb nur einen Teil des Standards umgesetzt, da alle Funktionalitäten auch auf dem RDBMS umgesetzt werden müssten. Ein zweiter Grund ist, dass viele heute populäre Datenbanksysteme nur schwer auf Standard-SQL umgerüstet werden können, da es als Konsequenz hätte, dass die standardisierten Versionen nicht mehr rückwärtskompatibel wären. Gerade bei Datenbanken, welche häufig über sehr lange Zeit bestehen, ist dies ein grosses Problem.
Wegen dieser Unterschiede ist es jeweils kaum möglich, Datenbanken von einem RDBMS in ein anderes zu übernehmen, ohne zuvor teils weitreichende Anpassungen vorzunehmen.
Varianten
SQL/PSM
SQL/PSM (SQL/Persistence Stored Modules) ist eine ISO-standardisierte Erweiterung des rein deklarativen Teils von SQL. Sie beinhaltet hauptsächlich prozedurale Funktionalitäten wie Stored Procedures (vordefinierte Funktionen) und Kontrollfluss (IF-Verzweigungen, Loops). SQL/PSM wird bei mehreren RDBMS verwendet, welche vor der Veröffentlichung des Standards keine eigene Implementation von prozeduralem SQL hatten, insbesondere MySQL.
T-SQL
Transact-SQL, oder kurz T-SQL ist Microsoft's Erweiterung der frühen ANSI-Standards. Neben prozeduralen Funktionalitäten umfasst T-SQL die Möglichkeit, lokale Variablen zu definieren, sowie Exceptions mit TRY/CATCH-Strukturen zu behandeln. Weiter verfügt Transact-SQL über eigene Implementationen von Funktionen für mathematische Operationen, und die Formatierung von Strings und Daten. Letztere existieren zwar auch im ANSI Standard, wurden aber erst nach der Implementation in T-SQL aufgenommen und unterscheiden sich deshalb in der Syntax.
PL/SQL
Oracle's Version von SQL ist PL/SQL (Procedural Language/SQL). Ähnlich wie T-SQL wurden mit PL/SQL die wichtigsten prozeduralen Aspekte implementiert, bevor diese in den Standard aufgenommen wurden. Neuere Versionen von PL/SQL verfügen sogar über Funktionalitäten, welche der objektorientierten Programmierung nahe kommen, wie komplexe Datentypen, Packages und Überladen von Funktionen.
Die meisten Varianten von SQL umfassen heute einen sehr ähnlichen Satz an Funktionalitäten. Die meisten Unterschiede sind rein syntaktischer Natur. Dennoch reicht dies aus, dass es bei grösseren Datenbanken nur schwer möglich ist, von einer Ausprägung von SQL auf eine andere umzusteigen.