On 2021-09-28 11:11, Edzard Egberts <
ne...@edzeg.net> wrote:
> Ich möchte über eine ODBC-Schnittstelle möglichst viele unterschiedliche
> Datenbanken bearbeiten können, gibt es dafür einen allgemeingültigen
> Ausschnitt des SQL-Befehlssatzes?
Jein. Die Antwort lautet: Der Teil des SQL-Befehlssatzes, der in
möglichst vielen Datenbanken implementiert ist. Das hilft Dir aber nicht
weiter.
Du kannst nicht davon ausgehen, dass alles, was im Standard steht,
überall funktioniert. Keine Datenbank implementiert den kompletten
Standard (selbst die PostgreSQL-Leute, die recht stolz darauf sind, dass
sie sehr nahe am Standard sind, sagen bei manchen Features schlicht
"Nein, das machen wir nicht" oder "Nein, das machen wir anders"), und
umgekehrt gibt es einige Features, die sehr weit verbreitet sind und
nicht im Standard stehen.
Das ist einfach Erfahrung. Die macht man mit der Zeit, wenn man mit
mehreren Datenbanken arbeitet. Aber wenn eine bisher unbekannte
dazukommt, kommen auch neue Erfahrungen dazu.
Oder Du verwendest ein ORM oder einen SQL-Builder (in Python z.B.
SQLAlchemy), da haben andere Leute die Erfahrung schon gemacht.
Hat weitere Vorteile, aber auch Nachteile (insbesondere ist das wieder
eine andere Sprache, die man erst lernen muss, und es ist ein weiterer
Abstraktionslayer, der lecken kann (und meiner Erfahrung nach auch
wird)).
> Diese Seite
https://www.sqltutorial.org/sql-list-all-tables/ hat mich
> gerade geschockt, muss man für einen grundlegenden Befehl wie "Tabellen
> der Datenbank anzeigen" wirklich für MSSQL, Oracle, MySQL, SQLLite, etc.
> jeweils einen unterschiedlichen Befehl absetzen?
Nein, aber die standardisierte Methode ist eher ein bisschen mühsam.
Daher (und auch weil es die meisten Datenbanken schon länger gibt als
den entsprechenden Abschnitt im Standard) hat jede Datenbank noch
"Abkürzungen".
Der Befehl heißt "SELECT" und man holt sich damit die Informationen aus
dem (einfallsreich benannten) information_schema. Also z.B. für die
Liste alle Tabellen:
select * from information_schema.tables;
Das geht ja noch, aber wenn Du Dir alle Informationen über eine
bestimmte Tabelle zusammensuchen willst (Spalten, Indexes, Foreign Key
Constraints, Check Constraints, ...) musst Du in einem halben Dutzend
verschiedener Tabellen nachschauen.
(Wobei man der Fairness halber dazusagen muss, dass das bei Oracle und
PostgreSQL auf SQL-Ebene auch mit den proprietären Methoden nicht anders
ist - DESC und \d sind Kommandos der SQL-Shell, keine SQL-Querys)
> Es gibt doch so etwas wie einen SQL-Standard, sind da so grundlegende
> Sachen wirklich nicht allgemeingültig definiert? Falls ja, wo finde
> ich die allgemeingültigen Sachen?
Im information_schema. Bzw. im Standard, denn jede Datenbank legt dort
auch Dinge ab, die nicht standardisiert sind, und wenn Du Dich darauf
verlässt, dass z.B. information_schema.tables eine Spalte create_time
enthält, nur weil es die in MySQL gibt, wirst Du bei PostgreSQL auf die
Nase fallen.
hp