SQL (Structured Query Language) hat sich als Abfragesprache für relationale Datenbanken durchgesetzt.
Zu den bekanntesten freien SQL-Datenbanken zählen
MySQL,
PostgreSQL und MaxDB.
Zu den größten kommerziellen Datenbankherstellern zählen Oracle und IBM.
Zu den bekanntesten freien SQL-Datenbanken zählen MySQL, PostgreSQL und MaxDB.
MySQL wird besonders häufig zusammen mit Web-Servern eingesetzt. Zum Beispiel Online-Shops beinhalten oft große Datenmengen, aber kommen mit einfach strukturierten Tabellen aus. Beliebt ist die 'LAMP'-Kombination: Linux + Apache + MySQL + PHP.
PostgreSQL ist auch für komplexere Anwendungen geeignet, in denen ANSI-SQL-Konformität, Views, Stored Procedures und Trigger benötigt werden. Es sollte möglichst nur PostgreSQL ab mindestens Version 7.1 verwendet werden, da ältere Versionen ohne besondere Maßnahmen pro Datenbankzeile nur bis zu 8 KByte verwalten konnten.
MaxDB ist der Nachfolger der SAP® DB (und damit auch von Adabas) und prädestiniert für ERP-Anwendungen.
MySQL 3.23 / 4.1 / 5.x | PostgreSQL 7.2 ... 8.0 | MaxDB 7.5 | |
---|---|---|---|
Web | techdocs/mysql.htm, http://www.mysql.com |
techdocs/postgresql.htm, http://www.postgresql.de |
http://maxdb.sap.com, http://www.sdn.sap.com/irj/sdn/maxdb |
Lizenz | GPL oder kommerziell | BSD-Lizenz | GPL oder kommerziell |
Dokumentation, Installation, Hilfsprogramme |
gute Doku, einfache Installation, viele Hilfsprogramme (z.B. MySQLCC, phpMyAdmin, DBDesigner) |
mäßige Doku, wenige Hilfsprogramme (z.B. pgAdmin, phpPgAdmin) |
einfache Installation, Hilfsprogramme (z.B. Database Manager / WebDBM, SQL Studio / WebSQL) |
Betriebssystem | Unix/Linux, Windows |
vorzugsweise Unix/Linux; bis Vers. 7.x Windows nur mühsam mit Cygwin, ab Vers. 8 auch ohne Cygwin |
Unix/Linux, Windows |
ANSI-SQL-Konformität | weniger | weitgehend SQL99 | weitgehend SQL99 |
Benutzerberechtigungen mit GRANT | ja | ja | ja |
Transaktionen | bis MySQL 3.23: nur mit Zusätzen InnoDB, BDB; ab MySQL 4.1: ja |
ja ('read committed' und 'serializable') |
ja |
Foreign Keys, Subselects | MySQL 3.23: nein; MySQL 4.1: ja |
ja | ja |
Views, Stored Procedures, Trigger | bis MySQL 4.1: nein; ab MySQL 5.x: ja |
ja | ja |
BLOB | z.B. LONGBLOB | per BYTEA (Byte Array) oder OID (Object Identifier) |
ja |
JDBC-Type-4-Treiber | ja | ja | ja |
Einsatzbereich, Geschwindigkeit | optimiert für Webserver mit eher einfacheren Zugriffen, vielen Lesezugriffen und wenigen Schreiboperationen | schnell bei vielen gleichzeitigen Benutzern und komplexeren Operationen; Verarbeitung geographischer Daten |
optimiert für SAP® ERP; auch für andere komplexe Anwendungen im kommerziellen Umfeld; auch OLTP |
Im Vergleich zu solchen freien Datenbanken bieten kommerzielle Systeme wie zum Beispiel von Oracle Vorteile wie überlegenere Clusterkonzepte, höheren Funktionsumfang bei Views, Stored Procedures und Triggern, höhere Sicherheit und ausgefeiltere Backup- und Recovery-Möglichkeiten.
Hinweise zur Installation und Benutzung von MySQL gibt es unter
mysql.htm.
Eine einfache Kurzanleitung zur Anlage einer Database und einer Tabelle finden Sie unter
mysql.htm#CreateDatabase.
Hinweise zur Installation und Benutzung von PostgreSQL gibt es unter
postgresql.htm.
Eine einfache Kurzanleitung zur Anlage einer Database und einer Tabelle finden Sie unter
postgresql.htm#CreateDatabase.
Um in einer eingerichteten Oracle-Datenbank eine Tabelle anzulegen, können Sie die folgende Zeilen in eine einfache ASCII-Textdatei mit der Dateiendung '.sql' speichern und diese SQL-Kommandodatei z.B. mit den Oracle-Tools SQL*Plus oder VAW einlesen und ausführen:
connect myLogin/myPassword@myDatabaseServer; DROP TABLE myOwner.myTable; CREATE TABLE myOwner.myTable ( FIELDNAME_XY1 VARCHAR(32) NOT NULL, FIELDNAME_XY2 VARCHAR(32) NOT NULL, FIELDNAME_XY3 NUMERIC(8,2) NULL, FIELDNAME_XY4 CHAR(1) NULL, CONSTRAINT FK_myTable_FIELDNAME_XY1 FOREIGN KEY( FIELDNAME_XY1 ) REFERENCES myOwner.otherTable( OTHER_NAME ), PRIMARY KEY( FIELDNAME_XY1, FIELDNAME_XY2 ), UNIQUE( FIELDNAME_XY2, FIELDNAME_XY3 ) ); INSERT INTO myOwner.myTable VALUES ( 'abc', 'xyz', 4711, 'X' ); GRANT SELECT ON myOwner.myTable TO myRole; SELECT * FROM myOwner.myTable;
Infos zur Java-Datenbank hSqlDb gibt es unter
http://hsqldb.org und im
Javamagazin 2003.03 ab Seite 97.
Hinweise zur Installation von hSqlDb und eine einfache Kurzanleitung zur Anlage einer Database und einer Tabelle gibt es unter
java-sql.htm#hSqlDb.
Von in Java programmierten Anwendungen aus erfolgt der Datenbankanbindung per JDBC-Treiber. Weiteres hierzu erfahren Sie unter SQL mit Java/JDBC.
Viele Anwendungen können mit SQL-Datenbanken über ODBC kommunizieren. Vorraussetzung ist die Einrichtung eines ODBC-Treibers auf dem Client-Rechner.
Über Datenbank-Clientprogramme können Datenbanken bequem bearbeitet werden. Die Datenbanken bieten dafür speziell zur Datenbank passende Administrationstools an. Es gibt aber auch universellere Tools mit vielleicht etwas geringerem Leistungsumfang, aber dafür für diverse verschiedene Datenbanken geeignet.
Zu Eclipse gibt es Datenbank-Clients als Eclipse-Plug-ins. Siehe dazu QuantumDB, SQLExplorer, jOra und Clay.
Für die Oracle DB wird gerne Toad von Quest verwendet. Mittlerweile gibt es Toad auch für andere Datenbanken, zum Beispiel für MySQL.
Als universelles Stand-alone-Programm ist SQuirreL recht beliebt (sowohl unter Windows als auch Linux etc.). Es setzt ein installiertes Java voraus und wird folgendermaßen installiert:
SELECT (SQL Data Query Language) |
(siehe auch "Einfache Beispiele für SQL-Kommandos") |
SELECT * FROM meineTabelle; | Alle Daten einer Tabelle lesen. |
SELECT * FROM "meine Tabelle"; |
Normalerweise unterscheidet SQL nicht zwischen Groß-/Kleinschreibung.
Wird der Tabellenname in Anführungszeichen gesetzt, muss Groß-/Kleinschreibung exakt stimmen und der Tabellenname immer genau so geschrieben werden. Einige Datenbanken akzeptieren dann auch Leerzeichen im Tabellennamen (was eigentlich nicht erlaubt ist). |
SELECT feldName1, feldName2 FROM meineTabelle; |
Bestimmte Felder (Spalten) einer Tabelle lesen. |
SELECT feldName1, feldName2 FROM meineTabelle ORDER BY feldName2, feldName1 DESC; |
Spalte(n) zur Sortierung vorgeben, entweder per Feldnamen oder auch per Spaltennummern. Bei Spaltennummern beachten: Die erste Spalte ist 1 (und nicht 0). Ohne DESC aufsteigend, mit absteigend. |
SELECT * FROM meineTabelle WHERE feldName1 = 'xy' AND feldName2 < 100 AND feldName3 BETWEEN 1 AND 10; |
Die Zeilen der Tabelle lesen, deren Elemente die Bedingung erfüllen. '=' testet auf Gleichheit, '<>' auf Ungleichheit und '<', '<=', '>' und '>=' vergleichen. Textstrings werden z.B. für Oracle DB, MySQL und MS Access mit einfachen Hochkommas, aber z.B. für InterBase mit doppelten Hochkommas eingeschlossen. |
SELECT * FROM meineTabelle WHERE UPPER(feldName1) = UPPER('xy'); |
Vergleich mit Ignorierung von Groß-/Kleinschreibung. Kommandos sind unterschiedlich je nach Datenbank. Großschreibung wird z.B. bei der Oracle DB mit UPPER() und bei MS-Access mit UCASE() erreicht. |
SELECT * FROM meineTabelle WHERE feldName1 LIKE 'B%'; |
Die Zeilen der Tabelle lesen, deren Element in der Spalte feldName1 mit einem großen B beginnt (oder mit '%abc%' den Teilstring 'abc' enthält). '_' ist Platzhalter für genau einen Zeichen, '__' für zwei Zeichen und '%' für eins oder mehrere Zeichen. |
SELECT * FROM meineTabelle WHERE feldName1 IN( 11, 13, 17 ); |
Selektiere Zeilen, wo feldName1 in angegebener Menge enthalten ist. |
SELECT * FROM meineTabelle1 WHERE feldName1 IN( SELECT feldName2 FROM meineTabelle2 ); |
Wie vorher, aber angegebene Menge ist Resultat von weiterer Abfrage (mit einspaltigem Ergebnis). |
SELECT meineTabelle1.feldName3, meineTabelle2.feldName4 FROM meineTabelle1, meineTabelle2 WHERE meineTabelle1.fremdSchlüsselFeld = meineTabelle2.primärSchlüsselFeld; |
Join zweier Tabellen. Leider ist die Syntax nicht bei allen Datenbanken gleich. Die gezeigte Schreibweise gilt z.B. für Oracle DB, MySQL und MS Access. Primärschlüsselspalte und Fremdschlüsselspalte können in der Datenbank entsprechend definiert werden. |
SELECT Autor.Name, Autor.Vorname, Buch.Titel, Gebiet.Bez, Verlag.Name_Kurz FROM Autor, Buch, Gebiet, Verlag WHERE Buch.Autor_Nr = Autor.Nr AND Buch.Gebiet_Abk = Gebiet.Abk AND Buch.Verlag_Nr = Verlag.Nr; |
Join vierer Tabellen. Bei Verknüpfung von n Tabellen sind n-1 Join-Kriterien erforderlich. |
SELECT * FROM Kunde K JOIN Bestellung B ON K.kdkey=B.kdkey; |
Join zweier Tabellen in einer für die Datenbank InterBase verständlichen Syntax. |
SELECT feldName1 "Nachname", feldName2 "Vorname" FROM meineTabelle; |
Aliasnamen: Für Feldnamen andere Bezeichnungen vorgeben. |
SELECT Nachname || ', ' || Vorname "Name" FROM meineTabelle; |
Konkatenation mit ||: Zwei Spalten werden zu einer Ausgabespalte (mit dem neuen Namen "Name") verbunden. |
SELECT SUBSTR( Name, 1, 1 ) FROM meineTabelle; |
Teilstring extrahieren. Parameter: String, Startposition, Länge. |
SELECT DISTINCT feldName1 FROM meineTabelle; |
DISTINCT bedeutet Zusammenfassung gleicher Elemente zu einer Zeile. |
SELECT COUNT(*) "Anzahl" FROM meineTabelle; |
Eingebaute Aggregatfunktionen: COUNT() (Anzahl), MIN(), MAX(), AVG() (Durchschnitt), SUM(). |
SELECT ZahlungsEmpfaenger, SUM(Betrag) FROM Rechnungen GROUP BY ZahlungsEmpfaenger; |
GROUP BY reduziert die returnierten Reihen pro Group-Wert auf eine Reihe. GROUP BY normalerweise zusammen mit Aggregatfunktionen (z.B. SUM, AVG ...). |
SELECT TO_CHAR( Datum, 'YYYY' ) FROM meineTabelle; |
Datentypkonvertierung: TO_CHAR() (String), TO_NUMBER() (Zahl), TO_DATE() (Datum). |
SELECT * FROM meineTabelle where date = TO_DATE( '2002-01-23_14:51', 'yyyy-MM-dd_HH24:mi' ); |
Datumsformatkonvertierung mit TO_DATE() (z.B. bei der Oracle DB). |
SELECT * FROM meineTabelle where date = TO_DATE( '2017-01-01 01:02:03.0', 'YYYY-MM-DD HH24:MI:SS.FF' ); |
Datumsformatkonvertierung mit Sekunden-Nachkommastellen mit TO_DATE() (z.B. bei der Oracle DB). |
SELECT SYSDATE FROM DUAL; | SYSDATE ist das aktuelle System-Datum. DUAL ist ein Dummy-Name als Platzhalter für eine Tabelle, wo eigentlich keine Tabelle benötigt wird. SYSDATE und DUAL werden nicht von allen Datenbanken unterstützt (aber z.B. von der Oracle DB). |
SELECT * FROM meineTabelle WHERE Datum >= (SYSDATE - 28); |
Die Zeilen der Tabelle lesen, deren Eintrag im Datumsfeld nicht älter als vier Wochen ist. Datums-Kommando ist unterschiedlich je nach Datenbank, z.B. SYSDATE bei der Oracle DB und NOW() bei MS-Access. |
SELECT 1 FROM DUAL WHERE EXISTS ( SELECT 1 FROM MeineTabelle WHERE ... ); |
EXISTS prüft Existenz. |
SELECT * FROM meineTabelle WHERE feldName1 IS NULL AND feldName2 IS NOT NULL; |
SQL returniert NULL, wenn ein Feld leer ist. Es gibt normalerweise keine Leerstrings. NULL kann nicht mit Vergleichsoperatoren geprüft werden, sondern mit IS NULL bzw. IS NOT NULL. |
SELECT Name, NVL( TO_CHAR(GebJahr), '?' ) FROM meineTabelle; |
NVL() ersetzt NULL Values durch etwas anderes. |
Select * from ( Select rownum rn, rslt1.* from ( Select * from MeineTabelle where ... order by ... ) rslt1 ) where rn = 10; |
Die 10. Zeile eines sortierten Ergebnisses auslesen. |
SELECT title, text FROM books WHERE CONTAINS( text, '!door' ) > 0; |
Ausrufezeichenoperator für phonetische Suche mit 'soundex' (nicht in allen Datenbanken implementiert, aber z.B. in der Oracle DB). |
DML (SQL Data Manipulation Language) |
|
INSERT INTO tabelleAutor ( Nr, NachName, VorName, GebJahr ) VALUES ( 1, 'Böll', 'Heinrich', 1917 ); |
Daten in bestehende Tabelle einfügen. Zahlenwerte ohne Hochkommas und Datentextstrings mit einfachen Hochkommas angeben. Soll der Wert eines Feldes nicht gesetzt werden, kann der entsprechende Feldname weggelassen werden oder alternativ als Datenelement NULL angegeben werden. |
UPDATE tabelleAutor SET Name = Otto, GebJahr = 1954, Beruf = NULL WHERE Nr = 10; |
Daten in Tabelle ändern. Auf NULL setzen bedeutet Feld löschen. |
DELETE FROM tabelleAutor WHERE Datum < (SYSDATE - 3650); |
Zeilen löschen (hier alle älter als 10 Jahre alten Einträge). |
COMMIT; | Transaktion: Die seit dem vorherigen COMMIT-Kommando eingegebenen SQL-DML-Kommandos wirklich ausführen. |
ROLLBACK; | Transaktion: Die seit dem vorherigen COMMIT-Kommando eingegebenen SQL-DML-Kommandos rückgängig machen. |
LOCK TABLE meineTabelle IN EXCLUSIVE MODE NOWAIT; |
Locking einer ganzen Tabelle (bis zum nächsten COMMIT oder ROLLBACK). (Locking einzelner Reihen geschieht automatisch bei Änderungen.) |
SELECT * FROM meineTabelle WHERE meinFeldname = 'xy' FOR UPDATE OF meinFeldname; |
Locking bestimmter per SELECT ... WHERE ... ausgewählter Datensätze (bis zum nächsten COMMIT oder ROLLBACK) schon beim Lesezugriff, damit zwischen Lesezugriff und späterer Änderung kein anderer Benutzer diese Datensätze ändern kann. |
DDL (SQL Data Definition Language) |
|
CREATE TABLE Autor ( Nr INT CONSTRAINT Pk_Autor PRIMARY KEY, Name VARCHAR(80) CONSTRAINT Nn_Autor_Name NOT NULL, VorName VARCHAR(80) CONSTRAINT Nn_Autor_VorName NOT NULL, GebJahr INT, Geschl CHAR(1) CONSTRAINT Ch_Autor_Geschl CHECK ( TYP IN ('m', 'w') ), UNIQUE( Nr ), UNIQUE( Name, VorName ) ); |
Tabelle anlegen. Namen/Bezeichner dürfen bis 30 Zeichen lang sein und keine Leerzeichen, Umlaute oder Sonderzeichen enthalten. Die SQL-Datentypen sind in unterschiedlichen Datenbanken leider verschieden definiert. Siehe dazu auch unten die Tabelle 'SQL-Datentypen und -Funktionen in unterschiedlichen Datenbanken'. INT und FLOAT kann in allen SQL-Datenbanken verwendet werden. NUMERIC(p,s) (oder DECIMAL(p,s), oder NUMBER(p,s)) speichert bei einigen Datenbanken Fließkommazahlen mit Angabe der maximalen Stellenanzahl und Nachkommastellenzahl. DATE ist entweder nur Datum oder Kombination aus Datum und Uhrzeit. CHAR(n) reserviert Speicherplatz in der festen angegebenen Länge (höchstens 255 Zeichen). VARCHAR(n) definiert Strings variabler Länge. n gibt die maximale Länge an (je nach Datenbank höchstens 255 oder 2000 Zeichen). Die Datentypen für lange Texte oder Binärdaten (z.B. Bilder) heißen bei verschiedenen Datenbanken unterschiedlich, z.B. BLOB (Binary Large Object), LONGBLOB, LONG RAW, LONG, LONGCHAR, MEMO. Die maximale Größe kann z.B. 64 KByte oder 4 GByte betragen. CONSTRAINT ... PRIMARY KEY definiert Primärschlüsselspalten. CONSTRAINT ... REFERENCES definiert Fremdschlüsselspalten. CONSTRAINT ... NOT NULL erzwingt Eingabewerte. CONSTRAINT ... CHECK ... ermöglicht zusätzliche Prüfungen. UNIQUE mit einem Parameter stellt sicher, dass es keine zwei gleichen Elemente in dieser Spalte gibt. Bei zwei Parametern gilt das Gleiche für Element-Kombinationen. |
ALTER TABLE meineTabelle MODIFY ( Nr NUMERIC(5) ); |
Änderung an bestehender Tabellenstruktur. |
ALTER TABLE meineTabelle ADD ( Tel NUMERIC(20), Fax NUMERIC(20) ); |
Spalten hinzufügen. |
DROP TABLE meineTabelle INCLUDING CONTENTS; |
Tabelle löschen. |
CREATE SEQUENCE Buch$Nr INCREMENT BY 1 MINVALUE 1; INSERT INTO Buch ( Nr, Autor_Nr, Titel ) VALUES ( Buch$Nr.NEXTVAL, 10, 'meinBuchTitel' ); |
Fortlaufende Nummer vergeben (z.B. für Primärkey). |
ALTER SESSION SET nls_date_format = 'YYYY-MM-DD'; |
Format der Datumsangabe für Oracle-Datenbank ändern. |
DCL (SQL Data Control Language) |
|
GRANT SELECT, DELETE, UPDATE, REFERENCES(Nr) ON meineTabelle TO Mueller; |
Rechte vergeben. |
REVOKE DELETE ON meineTabelle FROM Mueller; |
Rechte entziehen. |
MySQL 3.23 JDBC 2.0a (mm) |
PostgreSQL 7.2 JDBC 2, 7.2 |
Oracle 8.0 JDBC 8.1.6 (Oracle) |
Oracle 8.0 ODBC 1.2 (msorcl32.dll) |
MS Access 2000 ODBC 2.0001 |
|
INT, INTEGER | INT (32 bit signed, BIGINT 64 bit signed) |
INT4 | NUMBER (38 Stellen) | INTEGER | |
FLOAT | FLOAT (16 St., E+/-38 DOUBLE 24 St., E+/-308) |
FLOAT8 (mit variabler Nachkommastellenzahl) |
FLOAT (38 Stellen signed) |
FLOAT (38 Stellen signed) Nachkommastellenzahl 0,2,4,... |
DOUBLE |
DECIMAL | DECIMAL ohne Nachkommastellen |
NUMERIC mit variabler Nachkommastellenzahl |
NUMBER ohne Nachkommastellen | -- | |
NUMERIC | DECIMAL ohne Nachkommastellen |
NUMERIC mit variabler Nachkommastellenzahl |
NUMBER ohne Nachkommastellen | DOUBLE mit variabler Nachkommastellenzahl |
|
DECIMAL(p,s) NUMERIC(p,s) |
DECIMAL mit vorgegebener Nachkommastellenzahl |
NUMERIC mit vorgegebener Nachkommastellenzahl |
NUMBER mit variabler Nachkommastellenzahl |
NUMBER mit vorgegebener Nachkommastellenzahl |
-- |
NUMBER | -- | -- | NUMBER mit variabler Nachkommastellenzahl |
NUMBER Nachkommastellenzahl 0,2,4,... |
DOUBLE mit variabler Nachkommastellenzahl |
NUMBER(p,s) | -- | -- | NUMBER mit variabler Nachkommastellenzahl |
NUMBER mit vorgegebener Nachkommastellenzahl |
-- |
DATE | DATE (2000-11-28) |
DATE (2002-03-14) |
DATE (2000-11-28 16:59:57.0) |
DATE (2000-11-28 16:59:57) |
DATETIME (2000-11-28 16:59:57) |
DATETIME | DATETIME (2000-11-28 16:59:57) |
TIMESTAMP (2002-03-14 11:12:13) |
-- | DATETIME (2000-11-28 16:59:57) |
|
CHAR(n) | VARCHAR (bis 255 Zeichen) | BPCHAR | CHAR (bis 255 Zeichen) | CHAR (bis 255 Zeichen) | |
VARCHAR(n) | VARCHAR (bis 255 Zeichen) | VARCHAR | VARCHAR2 (bis 2000 Zeichen) | VARCHAR (bis 255 Zeichen) | |
BLOB, ... | BLOB (bis 64 KByte) LONGBLOB (bis 4 GByte) |
als BYTEA oder per OID (Object Identifier) |
BLOB (bis 4 GByte) LONG RAW (bis 2 GByte) |
kein BLOB, aber: LONGCHAR (bis 64 KByte) MEMO (bis 64 KByte) |
|
UPPER / UCASE | UPPER und UCASE | UPPER | UPPER | UCASE | |
SYSDATE / NOW | SYSDATE und NOW | NOW() | SYSDATE | NOW() |