Datenbank Tutorial
________________

Inhalt:

Teil 1 - Allgemeine Grundlagen

    1.1 Tabellen und Abfragen

    1.2 SQL - Structured Query Language

    1.3 Abfrage mehrerer Tabellen

    1.4 Abfrage mehrerer Tabellen: JOIN

    1.5 Gruppierung (GROUP BY)

Teil 2 - Die MEDAN-Datenbank

    2.1 Struktur der MEDAN-Datenbank

    2.2 Daten- und Referenztabellen

    2.3 Verknüpfung von Daten- und Referenztabellen

    2.4 Beispiel zur Abfrage der MEDAN-Datenbank

    2.5 "Resampling" mit der MEDAN-Datenbank


Teil 1 - Allgemeine Grundlagen
(Tabellen, Abfragen, SQL)


1.1 Tabellen und Abfragen

Tabellen speichern Datensätze in Zeilen; jeder Datensatz besitzt Felder, in denen die Daten des jeweiligen Datensatzes abgelegt werden:

Tabelle

Abfragen (Queries) ermöglichen den beliebigen Zugriff auf unterschiedliche Felder in einer oder mehreren Tabellen; außerdem können bestimmte Kriterien zur Auswahl angegeben werden:

Abfrage

In die SQL-Ansicht kommt man bei Access übrigens, wenn man in der grafischen Ansicht die rechte Maustaste klickt und "SQL" anwählt.


1.2 SQL - Structured Query Language

SQL ist eine standardisierte Hochsprache und wird u.a. von Access zum Zugriff auf Datenbanken benutzt.

SQL-Syntax zur Abfrage der Felder einer einzelnen Tabelle:

SELECT <Feld1>, <Feld2>,...
FROM <Tabelle>
WHERE <Abfragekriterien>
ORDER BY <Feld>,...;

Beispiel:

SELECT IDPATIENT, ALTER, EXITUSLETALIS
FROM PATIENTEN
WHERE ALTER>55 AND EXITUSLETALIS
ORDER BY ALTER;

zeigt die Felder IDPATIENT, ALTER und EXITUSLETALIS aller Datensätze in der Tabelle PATIENTEN an, bei denen der Feldeintrag ALTER größer als 55 und der Feldeintrag EXITUSLETALIS "wahr" ist; die Datensätze werden aufsteigend nach ALTER sortiert.


1.3 Abfrage mehrerer Tabellen

SQL-Syntax zur Abfrage der Felder mehrerer Tabellen:

SELECT <Feld1>, <Feld2>,...
FROM <Tabelle1>, <Tabelle2>,...
WHERE <Verknüpfung> AND <Abfragekriterien>
ORDER BY <Feld>,...;

Beispiel:

SELECT PATIENTEN.IDPATIENT, IDTRENDDATEN, WERT, DATUM, UHRZEIT
FROM PATIENTEN, TRENDDATEN_DER_PATIENTEN
WHERE ALTER>55 AND EXITUSLETALIS AND IDTRENDDATEN=1
  AND PATIENTEN.IDPATIENT=TRENDDATEN_DER_PATIENTEN.IDPATIENT
ORDER BY PATIENTEN.IDPATIENT, DATUM, UHRZEIT;

zeigt für alle verstorbenen Patienten, die älter als 55 Jahre waren, alle Herzfrequenz-Datensatze (IDTRENDDATEN=1) an und sortiert diese aufsteigend zunächst nach dem Patientenschlüssel IDPATIENT und anschließend nach Datum/Uhrzeit.


1.4 Abfrage mehrerer Tabellen: JOIN

Alternative SQL-Syntax zur Abfrage der Felder mehrerer Tabellen:

SELECT <Feld1>, <Feld2>,...
FROM <Tabelle1> INNER JOIN <Tabelle2> ON <Verknüpfung>
WHERE <Abfragekriterien>
ORDER BY <Feld>,...;

Beispiel:

SELECT PATIENTEN.IDPATIENT, IDTRENDDATEN, WERT, DATUM, UHRZEIT
FROM PATIENTEN INNER JOIN TRENDDATEN_DER_PATIENTEN
  ON PATIENTEN.IDPATIENT=TRENDDATEN_DER_PATIENTEN.IDPATIENT
WHERE ALTER>55 AND EXITUSLETALIS AND IDTRENDDATEN=1
ORDER BY PATIENTEN.IDPATIENT, DATUM, UHRZEIT;

ist äquivalent zur Beispielabfrage im vorigen Abschnitt.


1.5 Gruppierung (GROUP BY)

Gruppierungen ermöglichen z.B. die statistische Auswertung von mehreren Datensätzen.

SELECT <Feld1>, <Feld2>,...
FROM <Tabelle>...
WHERE <Abfragekriterien>
GROUP BY <Feld>,...
HAVING <Gruppenkriterien>
ORDER BY <Feld>,...;

Beispiel:

SELECT PATIENTEN.IDPATIENT, ALTER, Avg(WERT)
FROM PATIENTEN INNER JOIN TRENDDATEN_DER_PATIENTEN
  ON PATIENTEN.IDPATIENT=TRENDDATEN_DER_PATIENTEN.IDPATIENT
WHERE ALTER>55 AND EXITUSLETALIS AND IDTRENDDATEN=1
GROUP BY PATIENTEN.IDPATIENT, ALTER
HAVING Avg(WERT)<=100
ORDER BY PATIENTEN.IDPATIENT;

Avg(<Feld>) ist eine Funktion und berechnet den Mittelwert von <Feld>.


Teil 2 - Die MEDAN-Datenbank
(allgemeine Struktur, Daten- und Referenztabellen)


2.1 Struktur der MEDAN-Datenbank

Die Struktur und Verknüpfung der wichtigsten Daten- und Referenztabellen der MEDAN-Datenbank:

Struktur der MEDAN-Datenbank


2.2 Daten- und Referenztabellen

Datentabellen enthalten alle Patientendaten:
PATIENTEN
TRENDDATEN_DER_PATIENTEN
DIAGNOSEN_DER_PATIENTEN
OPERATIONEN_DER_PATIENTEN
TEXTDATEN_DER_PATIENTEN

Referenztabellen enthalten alle Parameter, die für die Arbeit mit und die Verwaltung der MEDAN-Datenbank benötigt werden (sie dürfen keinesfalls gelöscht oder geändert werden!!!):
TRENDDATEN
DIAGNOSEN
OP301
ICD10
BENUTZER
SEPSISSTATUS
SUBSYSTEME
TRENDDATEN_DER_SUBSYSTEME
KLASSEN
MEDIKAMENTENLISTE
OP301GRUPPEN, ICD10GRUPPEN
CHECKS, ERRORLEVELS
CHECKER_ERGEBNIS


2.3 Verknüpfung von Daten- und Referenztabellen

Daten- und Referenztabellen werden über sogenannte Schlüsselfelder (z.B. IDPATIENT oder IDTRENDDATEN) miteinander verknüpft. Diese Schlüsselfelder werden im JOIN-Teil von SQL-Abfragen verwendet.

Referenztabellen haben einen Primärschlüssel, der den entsprechenden Datensatz eindeutig kennzeichnet (z.B. IDTRENDDATEN in der Tabelle TRENDDATEN).

Datentabellen haben Referenzschlüssel, welche einen Datensatz der entsprechenden Referenztabelle eindeutig referenzieren (z.B. IDTRENDDATEN in der Tabelle TRENDDATEN_DER_PATIENTEN).

Die Datentabelle PATIENTEN ist gleichzeitig auch eine Referenztabelle für andere Datentabellen (z.B. TRENDDATEN_DER_PATIENTEN); ihr Primärschlüssel ist das Feld IDPATIENT.


2.4 Beispiel zur Abfrage der MEDAN-Datenbank

Aufgabe: Es soll der minimale und maximale pH-Wert für alle Patienten, die nicht verstorben sind und eine Liegezeit von mindestens 15 Tagen haben, angezeigt werden, und zwar absteigend nach dem maximalen pH-Wert sortiert.

1. Schritt: Auswahl der Stammdaten aus der Datentabelle PATIENTEN

Problem: Es gibt kein Feld für die Liegezeit eines Patienten!
Statt dessen wird die Liegezeit aus den Feldern AUFNAHMEDATUM und ENTLASSUNGSDATUM berechnet.
Lösung:

SELECT IDPATIENT, (ENTLASSUNGSDATUM-AUFNAHMEDATUM+1) AS [Liegezeit]
FROM PATIENTEN
WHERE NOT EXITUSLETALIS AND (ENTLASSUNGSDATUM-AUFNAHMEDATUM+1)>=15;

2. Schritt: Verknüpfen der Tabelle PATIENTEN mit der Datentabelle TRENDDATEN_DER_PATIENTEN

Der Referenzschlüssel IDTRENDDATEN für "pH" hat den Wert "8".
Lösung:

SELECT PATIENTEN.IDPATIENT, (ENTLASSUNGSDATUM-AUFNAHMEDATUM+1) AS [Liegezeit]
FROM PATIENTEN INNER JOIN TRENDDATEN_DER_PATIENTEN
  ON PATIENTEN.IDPATIENT=TRENDDATEN_DER_PATIENTEN.IDPATIENT

WHERE NOT EXITUSLETALIS AND (ENTLASSUNGSDATUM-AUFNAHMEDATUM+1)>=15
  AND IDTRENDDATEN=8;

3. Schritt: Gruppierung und Sortierung

Lösung:

SELECT PATIENTEN.IDPATIENT, (ENTLASSUNGSDATUM-AUFNAHMEDATUM+1) AS [Liegezeit],
       Min(WERT) AS [pH-Minimum], Max(WERT) AS [ph-Maximum]
FROM PATIENTEN INNER JOIN TRENDDATEN_DER_PATIENTEN
  ON PATIENTEN.IDPATIENT=TRENDDATEN_DER_PATIENTEN.IDPATIENT
WHERE NOT EXITUSLETALIS AND (ENTLASSUNGSDATUM-AUFNAHMEDATUM+1)>=15
  AND IDTRENDDATEN=8
GROUP BY PATIENTEN.IDPATIENT, ENTLASSUNGSDATUM-AUFNAHMEDATUM+1
ORDER BY Max(WERT) DESC;


2.5 "Resampling" mit der MEDAN-Datenbank

Problem: Wie finde ich einen Trenddatenwert, der zeitlich "in der Nähe" eines anderen Trenddatenwertes liegt?

naechsterWert(<IDPATIENT>, <IDTRENDDATEN>, <DATUM>, <UHRZEIT>,
              <maximale Abweichung in Stunden>
)

Diese Funktion gibt den Inhalt des Feldes WERT für den Datensatz in der Tabelle TRENDDATEN_DER_PATIENTEN zurück, der am nächsten zu DATUM/UHRZEIT liegt, aber um höchstens eine vorgegebene Anzahl von Stunden davon abweicht.

Beispiel:

SELECT IDPATIENT, WERT AS [pO2], DATUM, UHRZEIT,
       naechsterWert(IDPATIENT, 85, DATUM, UHRZEIT, 1) AS [FiO2]
FROM TRENDDATEN_DER_PATIENTEN
WHERE IDPATIENT=74 AND IDTRENDDATEN=9
ORDER BY DATUM, UHRZEIT;


B. Arlt, 07.01.2002

 

Tutorial: Abfragen der MEDAN-Datenbank