SQL-Grundlagen

+ andere TechDocs
+ SQL-Beispielkommandos
+ MySQL
+ PostgreSQL
+ SQL mit Java/JDBC
+


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.



Inhalt

  1. Vergleich MySQL, PostgreSQL und MaxDB
  2. Anlage einer Database und einer Tabelle
  3. JDBC (Java DataBase Connectivity)
  4. ODBC (Open DataBase Connectivity)
  5. Datenbank-Clientprogramm
  6. SQL-Anweisungen
    1. SELECT (SQL Data Query Language)
    2. DML (SQL Data Manipulation Language)
    3. DDL (SQL Data Definition Language)
    4. DCL (SQL Data Control Language)
  7. Einige SQL-Datentypen und -Funktionen in unterschiedlichen Datenbanken
  8. Weiterführende Informationen


Vergleich MySQL, PostgreSQL und MaxDB

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.



Anlage einer Database und einer Tabelle


MySQL

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.


PostgreSQL

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.


Oracle DB

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;

hSqlDb

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.



JDBC (Java DataBase Connectivity)

Von in Java programmierten Anwendungen aus erfolgt der Datenbankanbindung per JDBC-Treiber. Weiteres hierzu erfahren Sie unter SQL mit Java/JDBC.



ODBC (Open DataBase Connectivity)

Viele Anwendungen können mit SQL-Datenbanken über ODBC kommunizieren. Vorraussetzung ist die Einrichtung eines ODBC-Treibers auf dem Client-Rechner.


ODBC-System-DSN unter Windows erstellen für eine Microsoft-Access-Datenbank (.mdb-Datei)

  1. Unter Windows XP:
    Start | Systemsteuerung | Leistung und Wartung | Verwaltung | Datenquellen (ODBC);
    Unter älteren Windows-Versionen:
    Start | Einstellungen | Systemsteuerung,
    falls es hier einen ODBC-Datenquellen-Administrator gibt: anklicken,
    sonst: Verwaltung | Datenquellen (ODBC) wählen.
  2. System-DSN | Hinzufügen | Microsoft Access-Treiber (*.mdb),
    Datenquellenname (DSN-Name) vergeben,
    Auswählen des Datenbankdateipfades zur .mdb-Datei.

ODBC-System-DSN unter Windows erstellen für ein Oracle-RDBMS

  1. ODBC für Oracle-RDBMS nur einrichten, wenn besondere Gründe vorliegen.
    Z.B. für Java/JSP sollte unbedingt hierauf verzichtet werden, da der direkte JDBC-Treiber wesentlich schneller ist.
  2. Die Anbindung einer Applikation über ODBC an Oracle verläuft normalerweise durch folgende Schichten:
    Application, ODBC Driver manager (odbc32.dll), Oracle Driver (sqora*.dll), OCI layer (ora*.dll), SQL*Net Driver, Network Software (TCP/IP), SQL*Net Listener, Oracle RDBMS.
  3. Falls Verbindungsfehler auftreten: Genau prüfen, ob eine Firewall die Verbindung oder den Zugriff auf die Ports blockiert.
  4. Mit 'Ping' die TCP/IP-Verbindung überprüfen, z.B. mit: 'Ping OraServ'.
  5. Oracle-Client (und SQL*Net) von Oracle-CD installieren.
  6. Die 'SQL*Net Configuration Files' 'SqlNet.ora' und 'TnsNames.ora' (z.B. unter 'C:\OraWindows\Net80\Admin') überprüfen, anpassen oder eventuell mit dem 'Network Manager' neu generieren. Ihr Inhalt muss zusammenpassen und zur Datei 'Listener.ora' auf dem Oracle-Server passen.
    Beide Dateien darf es nur genau einmal auf dem Client-Rechner geben, um Mehrdeutigkeiten zu vermeiden (sie können sich auch im Netzwerk befinden, wenn unter 'HKEY_Local_Machine\Software\Oracle\TNS_ADMIN' der Pfad eingetragen ist).
    Drei beispielhafte Einträge für 'TnsNames.ora' (TNS = Transparent Network Substrate = Teil des Netzwerkprotokolls SQL*Net, Port = normalerweise 1521 oder 1526, SID = System Identifier, ORCL = Oracle, NMP = Named Pipes):
    MeinDbServer.world = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (Host = 127.0.0.1) (Port = 1521) ) ) (CONNECT_DATA = (SID = ORCL) ) )
    MeinDbServer.world = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = NMP) (Server = MeinDbServer) (Pipe = ORAPIPE) ) ) (CONNECT_DATA = (SID = ORCL) ) )
    MeinDbServer.world = (DESCRIPTION = (ADDRESS = (COMMUNITY = TCP.world) (PROTOCOL = TCP) (Host = OraServ) (Port = 1526) ) (CONNECT_DATA = (SID = MeinDbServer) (GLOBAL_NAME = MeinDbServer.world) ) )

  7. Mit 'TnsPing' die SQL*Net-Verbindung überprüfen, z.B. mit: 'TnsPing MeinDbServer'.
    Ist 'TnsPing' nicht installiert, kann die Verbindung notfalls auch mit 'telnet <hostname> <port>' geprüft werden.
    Zusätzlich kann auf dem Oracle-Server mit 'lsnrctl' überprüft werden, für welche Instanz der Listener des Servers das Netzwerk abhört, zum Beispiel so: 'lsnrctl status'.
  8. Eventuell mit den Oracle-Tools 'SQL*Plus', 'Plus80W' oder 'VAW' die Verbindung prüfen.
  9. 'Start' | 'Einstellungen' | 'Systemsteuerung',
    unter Windows XP: 'Leistung und Wartung',
    falls es hier einen 'ODBC-Datenquellen-Administrator' gibt: anklicken,
    sonst: 'Verwaltung' | 'Datenquellen (ODBC)' wählen,
    'System-DSN' | 'Hinzufügen' | 'Microsoft ODBC für Oracle',
    'Datenquellenname' ('Data Source Name', 'DSN-Name') beliebig vergeben,
    'Server-Namen' ('SQL*Net Connect String') eintragen exakt so wie in 'TnsNames.ora' (z.B. 'MeinDbServer').
  10. Mit 'ODBC-Test' die Funktion der ODBC-Verbindung prüfen.
  11. Falls es Probleme mit dem Dezimaltrennzeichen (',' bzw. '.') gibt (z.B. Oracle-Fehler ORA-01722, ungültige Zahl): Den Eintrag unter 'HKEY_Local_Machine\Software\Oracle\Home0\NLS_LANG' prüfen und entweder auf 'German_Germany.WE8ISO8859P1' oder auf 'AMERICAN_AMERICA.WE8ISO8859P1' setzen. Außerdem sollte die Einstellung des Dezimaltrennzeichens in der Windows-Systemsteuerung unter 'Regionale Einstellungen' | 'Anpassen' | 'Zahlen' überprüft werden.
  12. Aktuelle Microsoft-ODBC-Treiber (msorcl32.dll) gibt es unter: http://www.microsoft.com/data.
  13. Aktuelle Oracle-ODBC-Treiber und Hinweise gibt es unter: http://technet.oracle.com/tech/windows/content.html, rechts unter 'Quick Picks' auf 'ODBC' klicken und dann links auf 'Software' oder unten auf 'PDF ODBC FAQ'.

Per ODBC erreichbare Datenbank (z.B. Oracle DB) mit MS-Access bearbeiten

  1. "Microsoft Access" starten.
  2. "Leere Access-Datenbank" erstellen.
  3. Directory und Dateiname (*.mdb) wählen, "Erstellen".
  4. "Einfügen", "Tabelle" wählen.
  5. Entweder, wenn ursprüngliche ODBC-Datenbank mit MS-Access bearbeitet werden soll, "Tabelle verknüpfen" wählen,
    sonst, wenn eine eigenständige lokale Kopie einiger Tabellen erstellt werden soll, "Tabelle importieren" wählen.
  6. Als "Dateityp" "ODBC Databases ()" wählen.
  7. Reiter "Computerdatenquelle" wählen.
  8. Unter "Datenquellenname" den vorher eingerichteten ODBC-DSN-Namen auswählen, "OK".
  9. "Benutzername", "Kennwort" und "Server" eingeben.
  10. Die zu verknüpfenden Tabellen auswählen, "OK".
  11. Wenn nach Primärschlüssel (Primary Key) gefragt wird: falls bekannt, auswählen, sonst nichts auswählen.


Datenbank-Clientprogramm

Ü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:

  1. Installation unter Windows:
  2. SQuirreL (z.B. squirrel-sql-3.1-install.jar) downloaden von http://squirrel-sql.sourceforge.net oder http://www.squirrelsql.org.
  3. Im Kommandozeilenfenster eingeben:
    java -jar squirrel-sql-3.1-install.jar.
    Als Installationszielverzeichnis zum Beispiel 'D:\Tools\SQuirreL' angeben.
  4. Den zur Datenbank passenden JDBC-Treiber in das SQuirreL-'lib'-Verzeichnis (z.B. 'D:\Tools\SQuirreL\lib') kopieren.
  5. SQuirreL starten (über Icon oder über 'D:\Tools\SQuirreL\squirrel-sql.bat').
  6. Falls sich SQuirreL mit Fehlermeldung verabschiedet: Überprüfen, ob eine zu SQuirreL passende Java-Version installiert ist. SQuirreL 2.4 benötigt zum Beispiel mindestens Java 5 und SQuirreL 3.0 mindestens Java 6. Falls verschiedene Java-Version installiert sind und eine ältere im "JAVA_HOME" eingetragen sein muss: In der "squirrel-sql.bat" (bzw. analog in "squirrel-sql.sh") "LOCAL_JAVA" auf Java 6 setzen:
    'SET LOCAL_JAVA=C:\Program Files\Java\jdk1.6\bin\java'.
  7. Im 'Drivers'-Fenster muss vor dem gewünschten JDBC-Treiber (z.B. 'MySQL Driver') ein blauer OK-Haken sein.
  8. Im 'Alias'-Fenster mit dem blauen '+'-Zeichen eine neue Datenbankverbindung einrichten: Zuerst den korrekten 'Driver' wählen (z.B. 'MySQL Driver'), dann 'URL', 'User Name' und 'Password' eintragen. Die URL lautet für MySQL zum Beispiel 'jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName'. Weitere Beispiel-URLs für andere Datenbanken finden Sie in den Folgekapiteln unter 'JDBC'.
  9. Anschließend können Sie durch Doppelklick auf den neu erstellten 'Alias'-Eintrag eine Verbindung zur Datenbank herstellen und es öffnet sich ein neues Fenster.
  10. SQL-Kommandos können Sie unter dem 'SQL'-Tabulatorreiter eingeben.
  11. Vorhandene Tabellen und deren Eigenschaften und Dateninhalte können Sie am bequemsten ansehen, indem Sie unter dem 'Objects'-Tabulatorreiter die [+]-Zeichen anklicken, bis Sie unter 'TABLE' die Tabellennamen sehen. Klicken Sie darauf.
  12. Vergrößern Sie Ihr Tabellenansichtsfenster und achten Sie darauf, dass der senkrechte Fensterteiler nicht am rechten Rand steht. Ziehen Sie den Fensterteiler mit den kleinen schwarzen Dreiecken in die Mitte, um in der rechten Fensterhälfte die Reiter 'Info', 'Content' u.s.w. zu sehen. Klicken Sie auf 'Content', um den Tabellendateninhalt zu sehen.
  13. Erstellen Sie von bestehenden Tabellen ein Tabellenübersichtsdiagramm (inklusive Foreign-Key-Beziehungen), indem Sie die Tabellen im 'Objects'-Fenster markieren und über die rechte Maustaste 'Add to graph' wählen. Unter dem Tabulatorreiter 'New table graph' sehen Sie die Tabellen-Veranschaulichungen, die Sie frei verschieben können. Klicken Sie im 'New table graph'-Fenster mit der rechten Maustaste auf den weißen Hintergrund für weitere Optionen.
  14. Sehen Sie sich die SQuirreL-Doku an unter: http://squirrel-sql.sourceforge.net/paper/SQuirreL_de.pdf.
  15. Falls SQuirreL-Einstellungen von einem Rechner zu einem anderen transportiert werden sollen: Die lokalen Einstellungen sind unter Windows gespeichert unter: 'C:\Users\<Benutzername>\.squirrel-sql'.


SQL-Anweisungen


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.


Einige SQL-Datentypen und -Funktionen in unterschiedlichen Datenbanken


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



Weiterführende Informationen





Weitere Themen: andere TechDocs | SQL-Beispielkommandos | MySQL | PostgreSQL | JSP | Webanwendungen | SAP BAPI®
© 1998-2007 Torsten Horn, Aachen