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() | |