Dienstag, 6. September 2011

Logik und SQL

Heute geht's um die Verwendung von Kenntnissen aus der Aussagenlogik und wie man diese im Rahmen von SQL anwenden kann. Als Beispiel dient die Forderung, dass ein Analyst ein Gehalt von mindestens 2500 erhalten muss.

Diese Forderung kann man wie folgt formulieren:
WENN ( JOB = 'ANALYST' ) DANN ( SAL >= 2500 )
Das entspricht der Implikation in der Aussagenlogik:
( JOB = 'ANALYST' ) -> ( SAL >= 2500 )
Die Implementierung umfasst die Definition eines Check-Constraints für die Tabelle EMP. Zwar existiert in SQL der CASE-Operator, jedoch kann dieser bei der Spezifikation der Bedindung nicht verwendet werden; dies gilt auch für die Verwendung von PL/SQL. Man kann die Forderung aber mithilfe der Operatoren NOT und OR angeben, welche beide von SQL unterstützt werden. Die folgende Warheitstabelle zeigt die Gültigkeit von:
A → B ≡ ¬A ∨ B
A B A → B ¬ A ∨ B
T T T T
T F F F
F T T T
F F T T

Man kann erkennen, dass der Warheitswerteverlauf der dritten Spalte mit dem der vierten Spalte übereinstimmt. Das macht man sich nun zu Nutze, um die Bedingung umzuformen:
NOT ( JOB = 'ANALYST' ) OR ( SAL >= 2500 )
Der erste Teil kann wie folgt vereinfacht werden:
( JOB != 'ANALYST' ) OR ( SAL >= 2500 )
Diese Formulierung kann man nun im Rahmen des Check-Constraints verwenden:
alter table emp
add constraint c_emp_analyst_sal
check ( job != 'ANALYST' or sal >= 2500 );
Schon dieses einfache Beispiel zeigt, dass grundlegende Kenntnisse aus dem Bereich der Logik von Vorteil sind. Natürlich gibt es dazu noch weitere interessante Themen, wie zum Beispiel die systematische Herleitung von SQL Abfragen durch die Verwendung von Prädikatenlogik; aber dazu mehr in einem anderen Post.

2 Kommentare:

  1. sehr schönes Blog (sowohl der Eintrag als auch die Website) - Logik kommt im Datenbankbereich erstaunlich oft zu kurz.

    Viele Grüße

    Martin Preiß

    AntwortenLöschen
  2. Hallo Martin,

    vielen Dank für dein Feedback. Zu diesem Thema wird es, wie angekündigt, noch weitere Beiträge geben.

    Viele Grüße

    Thomas Uhren

    AntwortenLöschen