Autor Thema: SQL: Eintauchen in die Welt der Datenbanken  (Gelesen 16705 mal)

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
« Letzte Änderung: 07. September 2006, 00:35:22 von niKoN »
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
Allgemeines
« Antwort #1 am: 06. September 2006, 23:45:16 »
In der heutigen IT-Welt ist es fast unumgänglich sich mit dem Umgang von Datenbanktabellen vertraut zu machen. Kaum einer kommt nicht in den Kontakt mit relationalen Datenbanken und, damit verbunden, der gängigen Datenbank-Abfragesprache SQL. Im Internet gibt es viele Beschreibungen zu SQL und relationalen Datenbanken, jedoch sind viele dieser Dokumente zu technisch bzw. betrachten nur spezielle Bereiche der doch breiten Informationspalette.

In diesem Artikel möchte ich euch eine kurze Einführung zu Datenbanken und SQL geben, lege jedoch eher Wert auf Datenformate und Datenbankbefehle, speziell dem "SELECT".


Allgemeines

SQL ist eine deklarative Abfragesprache für relationale Datenbanken. SQL („Structured Query Language“) ist aus SEQUEL (Structured English Query Language) hervorgegangen, das von IBM entworfen wurde. Sie hat eine relativ einfache Syntax und stellt eine Reihe von Befehlen

  • zur Definition von Datenstrukturen nach der Relationalen Algebra
  • zur Manipulation von Datenbeständen (Anfügen, Bearbeiten und Löschen von Datensätzen)
  • zur Abfrage von Daten

zur Verfügung.

Durch ihre Rolle als Quasi-Standard ist SQL von großer Bedeutung, da eine weitgehende Unabhängigkeit von der benutzten Software erzielt werden kann.

Dr. Edgar Frank Codd (1923-2003 ) schuf in den 1960er und 70er Jahren bei seiner Forschungsarbeit am IBM Almaden Research Center in San Jose die Grundlagen der relationalen Datenbanken. Bis heute stellen diese einen De-facto-Standard unter den Datenbanktechniken dar.
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
SQL Datenbanken
« Antwort #2 am: 06. September 2006, 23:47:35 »
Eine Datenbank ist die elektronische Form eines Karteikastens bzw. eines Systems zusammengehöriger Karteikästen. Es handelt sich um eine Sammlung von Daten, die aus der Sicht des Benutzers zusammengehören, z. B. eine Waren- oder Adressdatenbank. Die Datenbank wird üblicherweise von einem Datenbankverwaltungssystem (engl. database management system, DBMS) verwaltet. Ein DBMS zusammen mit einer oder mehreren Datenbanken nennt man Datenbanksystem (DBS). Es gibt hierarchische, relationale (RDBMS), multidimensionale und objektorientierte Datenbanken.
Eine relationale Datenbank ist eine Datenbank, die auf dem relationalen Datenbankmodell basiert; darin ist "Relation" ein im streng mathematischen Sinn wohldefinierter Begriff (terminus technicus), der im Wesentlichen ein mathematisches Modell für eine Tabelle beschreibt. Die Daten werden dabei in Form von zweidimensionalen Tabellen verwaltet, die über Schlüssel (Primärschlüssel, Fremdschlüssel) miteinander verknüpft werden können. Die meisten in der Praxis eingesetzten Datenbanksysteme sind für relationale Datenbanken konzipiert.

Im allgemeinen Sprachgebrauch ist deshalb oft eine relationale Datenbank bzw. ein relationales Datenbanksystem gemeint, wenn von Datenbanken die Rede ist. Relationale Datenbanken, wie das „MySQL“, legen die Daten in Form von Tabellen ab. Dabei ist es möglich, mehrere Tabellen anzulegen, miteinander zu verknüpfen und abzufragen. Die Gesamtheit dieser Tabellen bildet dann die Datenbank.
Heute gängige Datenbanksysteme sind z.B. DB2, Oracle, InterBase, SQLite, MySQL, SQL Server und das wohl eher ungeliebte Access von Microsoft.



« Letzte Änderung: 07. September 2006, 04:03:44 von niKoN »
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
Verfügbare Befehle für SQL
« Antwort #3 am: 06. September 2006, 23:52:08 »
In SQL unterscheidet man mehrere Befehlsgruppen:

  • Befehle die zur Datendefinition dienen
    Diese Befehlsgruppe wird als Data Definition Language (DDL) bezeichnet.
  • Befehle die zur Manipulation der Daten verwendet werden
    Diese Gruppe wird Data Manipulation Language (DML) genannt.
  • Eine besondere Bedeutung kommt dem sogenannten SELECT-Kommando zu, mit dem man Auswertungen fast jeder Komplexität durchführen kann.


Darüber hinaus gibt es Befehle, welche

  • die Vergabe von Zugriffsrechten steuern (DCL, Data Control Language)
  • die Struktur und Größe der Datenbank beeinflussen


Alle SQL-Befehle können bei ORACLE mit dem Programm sqlplus ausgeführt werden.
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
Datentypen und Operatoren
« Antwort #4 am: 06. September 2006, 23:58:07 »
Folgende Datenformate sind wohl die gängigsten und meistverwendeten Typen in Datenbanken.


  • INTEGER: Ganze Zahl (positiv oder negativ)

  • CHAR(n): Es werden stets n-Byte benutzt (u.U. mit Blanks aufgefüllt) Max 255 Bytes

  • VARCHAR(n): Synonym für varchar2 max. 2000 Bytes, könnte in der Zukunft für ein neues Datenformat verwendet werden

  • VARCHAR2(n): Variable Spaltengröße, nur tatsächlich benützte Bytes werden belegt (max. 2000 Bytes bei Oracle7, 4000 Bytes bei Oracle 8)

  • NUMBER(v,n): Integer oder Real (v=Vork., n=Nachk. ) max. v=38, n=-84 bis +127, es wird nur tatsächlich benutzte Länge gespeichert

  • DATE: zur Speicherung des Datums (4 Byte) und Uhrzeit (3 Byte) bis 31.12.4712, bei nur Datum bis zum 31.12.9999

  • RAW(n): zur Speicherung von Binärdaten max. 2000 Bytes (Oracle 7)

  • LONG: zur Speicherung von alpha-num Daten (var. Spaltengröße) max. 2 GB, max. 1 je Tabelle

  • LONG RAW: für binäre Daten (var. Spaltengröße) max. 2 GB max. 1 je Tabelle

  • BLOB: Binary Large Object, es werden nur Zeiger zurückgegeben max. 4 GB, beliebig viele LOBS je Tabelle

  • CLOB: Character Large Object Max 4 GB, beliebig viele LOBS je Tabelle


Die im folgenden aufgeführten Operatoren können innerhalb der meisten SQL-Anweisungen verwendet werden.


Arithmetische Operatoren:


  • () überschreibt die normalen Vorrangregeln select (x+y)/(x-y)

  • + - bezeichnet einen positiven oder negativen ...where wert = -1 Ausdruck ...where -gehalt < 0

  • * / multiplizieren u. dividieren select 2*x+1

  • + - addieren u. subtrahieren ...where x > y/2


Vergleichsoperatoren:


  • () überschreibt die normalen Vorrangregeln ...not(a=1 or b=1)

  • = Prüfung auf Gleichheit ...where X = 1000

  • !=,^=,<> Test auf Ungleichheit ...where X != 1000

  • >,<,>=,<= Tests auf kleiner/größer als ...where X >= 1000

  • IN Gleichheit zu einem Mitglied, einer Liste oder Subquery. ...where Y in Menge ('A','B')

  • NOT IN schliesst Gleichheit zu einem Mitglied, einer Liste oder Subquery aus. ...where X not in

  • ANY vergleicht einen Wert mit jedem Wert aus einer Liste oder Subquery. ...where X = any
    vorausgehen muß einer der Operatoren =,!=,<,>,<=,>=

  • ALL vergleicht einen Wert mit allen Werten aus einer Liste oder Subquery. ...where (X,Y) >= all
    vorausgehen muß einer der Operatoren =,!=,<,>,<=,>=

  • [NOT] negiert Operationen ...where X not between 0 and 5
    [NOT] liefert TRUE, wenn eine Subquery mindestens eine Zeile zurückliefert

  • LIKE Definiert Ähnlichkeitswerte. Zeile stimmt mit dem nachfolgenden Muster annähernd überein.. Das Zeichen "%" kann hierbei auch als Platzhalter verwendet werden. ... where X like 'AB%'


Logische Operatoren:


  • AND logisches UND ...where a=1 and b=1

  • OR logisches ODER ...where a=1 or b=1


Mengenoperatoren


UNION kombiniert Queries, indem alle Zeilen geliefert werden, die von jeder einzelnen Abfrage erfaßt werden select... union select

[/B]INTERSECT[/B] Mengen-Durchschnitt der Zeilen ...select ... intersect select

MINUS Mengen-Differenz ...select ... minus select


Sonstige Operatoren:


COUNT liefert die Anzahl der Zeilen für die X nicht NULL ist ...select count(X) from Y

COUNT(*) liefert alle Zeilen einer Tabelle

DISTINCT eliminiert doppelte Zeilen oder doppelte Werte in einem Aggregatausdruck ... select distinct *
« Letzte Änderung: 08. September 2006, 07:54:58 von doadro »
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
Der SELECT-Befehl
« Antwort #5 am: 07. September 2006, 00:12:29 »
Das Besondere an einer Datenbank ist die Möglichkeit der gezielten Abfrage nach Informationen. Kleine Datenbanken sind für den Anwender noch überschaubar und er weiß, wo sich welche Informationen befinden. Mit zunehmenden Umfang der gespeicherten Informationen sind jedoch Abfragen unerlässlich, da die Suche nach den Informationen mehr Zeit benötigt, als das Erstellen der Abfragen.

Der Aufbau eines SELECT-Befehls besteht immer aus drei Komponenten:

1. SELECT (Auswahl)
2. FROM (Ort der Informationsermittlung)
3. WHERE (Bedingung)

SELECT Key, Name, Vorname, PLZ, Adresse FROM Kundendaten WHERE PLZ als “30%“;

Die Select-Anweisung dient dem Ermitteln von Informationen (Retrieval). Das SELECT-Kommando ist die Anweisung mit der größten Komplexität. Das Ergebnis einer Datenbankabfrage kann durch die Angabe einer Vielzahl von Schlüsselwörtern beeinflußt werden.

Nur die Angabe der SELECT-und der FROM-Klausel sind unbedingt erforderlich.


Beispiele


1.
SELECT NR,
NAME,
PREIS
FROM ARTIKEL

Einfache, kommagetrennte Auflistung der gewünschten Spalten, die im Tabellen-Ausdruck vorkommen. Ohne Alias für die Tabelle.

2.
SELECT X.NR,
X.NAME,
X.PREIS
FROM ARTIKEL As X
ORDER BY X.PREIS

Dasselbe wie im ersten Beispiel, aber mit Aliasname X für die Tabelle und aufsteigender Sortierung nach der Spalte PREIS.

3.
SELECT NR,
PREIS As Netto,
0.16 As MwSt,
PREIS * 1.16 As Brutto,
FROM ARTIKEL
ORDER BY PREIS DESC

Hier werden Alias-Ausdrücke für die Spalten verwendet - das Ergebnis kennt die drei Spalten Netto, MwSt und Brutto. MwSt ist ein konstanter Wert, in der Spalte Brutto wird der Inhalt von PREIS multipliziert mit einer Konstanten. Da ein solches Ergebnis keinen Spaltennamen hat, sollte dieser anschließend festgelegt werden. Das Ergebnis wird nach PREIS absteigend sortiert.

4.
SELECT X.* FROM ARTIKEL As X
ORDER BY X.NAME ASC,
X.PREIS DESC

Hier wird für die Tabelle ein Alias X verwendet und mit '*' sämtliche Spalten ausgewählt. Das Ergebnis wird aufsteigend nach den Artikel-Namen, absteigend nach den Artikel-Preisen sortiert.

5.
SELECT DISTINCT X.NAME
FROM ARTIKEL As X

Das Schlüsselwort 'DISTINCT' entfernt alle mehrfach vorkommenden Zeilen mit Ausnahme einer. Diese Abfrage liefert deshalb nicht vier Zeilen mit doppeltem 'NAME', sondern nur drei Zeilen zurück. Eine Zelle mit dem 'NAME' wurde entfernt.

6.
SELECT X.NAME
FROM ARTIKEL As X
UNION
SELECT Y.NAME
FROM VERTRETER As Y

Diese inhaltlich merkwürdige Abfrage liefert alle Artikel- und alle Vertreter-Namen in einer einzigen Liste aus. Da 'ALL' fehlt, werden sechs Zeilen ausgegeben, das doppelte 'ARTIKEL' wird nur einfach in das Resultset übernommen. Beachten Sie, daß die Datentypen übereinstimmen müssen und daß jede einzelne SELECT-Abfrage dieselbe Zahl von Spalten zurückliefern muß. Die Spaltennamen müssen allerdings nicht übereinstimmen. Bei den SELECT-Anweisungen ab der zweiten Abfrage kann auf ALIAS-Namen verzichtet werden.
« Letzte Änderung: 07. September 2006, 04:05:56 von niKoN »
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
Tipps & Tricks
« Antwort #6 am: 07. September 2006, 00:16:24 »
Hexcodes in SQL ausgeben


Um Ausgabewerte als Hex-Codes zu zeigen, kann die Datenbank-Funktion "rawtohex" verwendet werden

select rawtohex() from ...

DB-Keys ermitteln


Um die Keys einer Datenbanktabelle zu ermitteln verwendet man folgenden Befehl:

select INDEX_NAME, COLUMN_POSITION, COLUMN_NAME
from ALL_IND_COLUMNS
where TABLE_NAME='XXXXX'
order by INDEX_NAME, COLUMN_POSITION


SQL-Ausgabezeile vergroessern


Um die Ausgabezeile eines 'SQL+' - Fensters zu vergrössern muss der Befehl

set lines
eingegeben werden.
Dieser legt die Zeichenbreite für die Ausgaben der SQL-Statements fest. Das Maximum liegt bei 156 Zeichen


SQL-Kommandos


Kommandos für das schnelle Editieren eines SQL-Statements aus der Kommandozeile heraus (ohne Editor):


  • l: listet das aktuelle Statement mit Zeilennummern und positioniert auf die mit "*" markierte Zeile
  • : Positioniert für weitere Aktionen auf Zeile
  • a : an das Ende der current line des vorherigen SQL-Statements anhängen. Wichtig: 2 Leerzeichen, da sonst ohne Trennzeichen angefügt wird
  • c//: Ersetzt in der current line die Zeichenkette durch die Zeichenkette
  • c--: Alternative, wenn der zu ändernde string slash ( / ) enthält
  • "i": Fügt einem SQL-Statement eine Zeile hinzu. ist die Zeilenummer, nach der eine Zeile eingefügt werden soll.


Prüfung auf Datenbankinstanz


Der Name der Datenbankinstanz eines bestehenden SQL-Fensters kann mit folgendem Statement ermittelt werden:

select * from global_name;

Loadjava


Bevor mit dem Befehl loadjava Javaklassen in die Datenbank geladen werden können, muss als SYS das Script

$ORACLE_HOME/ javavm/install/initjvm.sql
ausgeführt werden.
« Letzte Änderung: 07. September 2006, 04:07:55 von niKoN »
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit

Offline niKoN

  • hat sich nen Bong gebaut
  • **
  • Beiträge: 602
  • The Transporter ;)
gr33tz niKoN

Board: Gigabyte X48-DS4 | CPU: Intel® Core2Duo® E7600@4000 MHz @ 1.325V | Kühler:  Alphacool NexXxos XP | Ram: 2x 2GB Corsair Dominator TWIN2X4096-8500C5DF @750 4-4-4-12 @ 1,8V | VGA: Powercolor HD4870 | HDD: 2x Samsung Spinpoint F1 HD642JJ 640 GB | Netzteil:  BeQuiet Dark Power Pro 750 Watt | OS: Windows Vista Business 64 Bit