SQL-Grundlagen

Nachfolgend eine kurze Übersicht der von uns verwendeten Begriffe.

Tabelle / Table

In einer relationalen Datenbank werden die Daten in Tabellen gespeichert.
Eine Datenbanktabelle ist eine Menge von Daten, die in Spalten und Zeilen einer Tabelle strukturiert sind. Dabei legen die Spalten fest, was in der Tabelle gespeichert wird. In den Zeilen liegen dann die einzelnen Datensätze.
Die Tabelle besteht also aus:
  • Struktur - Spalten
  • Inhalt - Zeilen

Spalte / Column

Ein vertikaler Eintrag einer Tabelle wird Spalte (engl. column) genannt. Eine Column wird oft auch als Attribut bezeichnet. Man unterscheidet zwischen identifizierenden (Schlüssel) und beschreibenden Attributen.
Die Spalten einer Tabelle haben u.a. folgende Eigenschaften:
  • Name
  • Datentyp
  • Definition: NULL (Default) / NOT NULL (Sind leere Werte erlaubt oder nicht.)

Zeile / Row

Ein horizontaler Eintrag einer Tabelle wird Zeile (engl. row) genannt und entspricht einem einzelnen Datensatz. (Oft auch Tupel genannt.)
Jede Zeile (Datensatz, Tupel) besteht aus einer Reihe von Attributwerten, den Spalten der Tabelle.

Schlüssel / Primary-Key oder Foreign-Key

Jeder Datensatz in einer Relationalen Datenbank muss durch einen eindeutigen Schlüssel identifizierbar sein. Ein Schlüssel kann dabei aus einer oder mehreren Spalten (Attribut) bestehen. Meist wird als Schlüssel eine fortlaufende Nummerierung verwendet. Dieser Wert wird dann als Primärschlüssel (Primary-Key oder PK) bezeichnet. Ein Fremdschlüssel (Foreign-Key oder FK) ist eine Spalte in einer Tabelle, welche auf einen Primärschlüssel einer anderen Tabelle verweist. (Beziehung/Relation)
Beispiel:
Tabelle: SalDocItem enthält den FK SalDocItem.SalDocInternalNo
SalDocItem.SalDocInternalNo verweist auf die Tabelle SalDoc, welche als PK SalDoc.InternalNo enthält.
SalDocItem.SalDocInternalNo (FK) -->> SalDoc.InternalNo (PK)

Beziehungen / Relations

In einer relationalen Datenbank werden nur Daten, aber keine Beziehungen (engl. relation) abgelegt. Die Beziehungen werden durch das Vergleichen von Primary-Key und Foreign-Key in den verschiedenen Tabellen hergestellt. Hierbei spielt die Art der Beziehung eine zentrale Rolle.
Wir unterscheiden zwischen folgenden Beziehungen:
  • Einfache Beziehung (1:1)
    Jeder Datensatz aus Tabelle A entspricht genau einem Datensatz aus Tabelle B.
  • Konditionelle Beziehung (1:0 oder 1:1)
    Jeder Datensatz aus Tabelle A entspricht keinem, oder genau einem Datensatz aus Tabelle B.
  • Multiple Beziehung (1: >=1)
    Jeder Datensatz aus Tabelle A entspricht einem oder mehreren Datensätzen aus Tabelle B.
  • Multiple konditionelle Beziehung (1:n)
    Jeder Datensatz aus Tabelle A entspricht keinem, einem, oder mehreren Datensätzen aus Tabelle B.

Sicht / View

Eine Sicht (View) ist eine virtuelle Tabelle, welche eine physische Tabelle oder einen Teil davon repräsentiert. Diese wird eingesetzt um die Formulierung von Abfragen zu vereinfachen. Der Datenbankbenutzer kann eine View wie eine normale Tabelle abfragen. Eine View stellt im Wesentlichen einen Alias für eine Abfrage dar.

Index

Ein Index ist eine von der Datenstruktur getrennte Indexstruktur, welche die Suche und das Sortieren nach bestimmten Feldern beschleunigt. Ein Index besteht aus einer Ansammlung von Zeigern (Verweisen) die eine Ordnungsrelation auf eine oder mehrere Spalten in einer Tabelle definieren.

SQL (Structured Query Language)

SQL teilt sich in vier Sprachkomponenten auf:
SQL_Sprachkomponenten.jpg
Query in OpaccERP ist Bestandteil der DML und stellt Funktionen für das Lesen (SELECT) von Daten zur Verfügung.

Vergleich von SQL-Select und Query-Abfrage

Die Query-Abfrage bzw. der Query-Service verwendet bestimmte Argumente welche dann in SQL-spezifische Anweisungen "übersetzt" werden.
Diese Argumente zeigen sich in einer eigenen "Syntax" des Query-Service.
Einfaches SQL Select-Statement:
SELECT M01.Addr.FirstName, M01.Addr.LastName 
from M01.Addr 
WHERE M01.Addr.LastName like 'Vonwil'
Dieselbe Abfrage als Query:
Query
Main=Addr
MaxRows=All
Columns=Addr.FirstName,Addr.LastName
Filter=Addr.LastName like 'Vonwil'
Dieselbe Abfrage als Query in F-Script (XQRY):
«XQRY(reqQuery:clear)»
«XQRY(reqQuery:addArg=Main=Addr)»
«XQRY(reqQuery:addArg=MaxRows=All)»
«XQRY(reqQuery:addArg=Columns=Addr.FirstName,Addr.LastName)»
«XQRY(reqQuery:addArg=Filter=Addr.LastName like 'Vonwil')»
«nXQRY(reqQuery:execute>resQuery)\A»