How to create an SQL

Vorweg

  • Analysieren die Tabellen

  • Wie stehen die Datensätze in Beziehung

  • Guck' Dir die Datensätze an

Template

m:n Beziehung. Patient kann in mehrern Zimmern liegen, in einem Zimmer liegen mehrere Parienten.


Patient_Aufenthalt ist die Zwischentabelle.

Bewegungsdaten

  • Sind Nullwerte vorhanden?
  • Wie sehen die IDs aus?

SELECT

  • Guck Dir an WAS selektiert werden muss.

  • Guck Dir an, WO die Felder herkommen.

  • Müssen Felder berechnet werden? (Aggregatfunktionen)

Template

Ergebnis der Abfrage !!!

SELECT Pat_Name, Pat_Vorname, Pat_GebDatum

Merke!!

ALLE (!) Felder, die in der Abfrage zu sehen sind, müssen in der SELECT Abfrage selektiert werden!

SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EntlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, 
(ent-auf)  
as Dauer 
SELECT Bett_Nummer 

FROM

  • Guck Dir an WAS selektiert werden muss.

  • Guck Dir an, WO die Felder herkommen.

  • Alle Tabellen, in dem anzuzeigende Felder vorkommen, müssen selektiert werden.

  • Ist mehr als eine Tabelle involviert, muss gejoint werden.

  • Natural Join nur, wenn die Bezeichner gleich sind.

Template

  • Guck Dir an WAS selektiert werden muss.

  • Guck Dir an, WO die Felder herkommen.

  • Alle Tabellen, in dem anzuzeigende Felder vorkommen, müssen selektiert werden.

  • Ist mehr als eine Tabelle involviert, muss gejoint werden.

  • Natural Join nur, wenn die Bezeichner gleich sind.

Template

  • Guck Dir an WAS selektiert werden muss.

  • Guck Dir an, WO die Felder herkommen.

  • Alle Tabellen, in dem anzuzeigende Felder vorkommen, müssen selektiert werden.

  • Ist mehr als eine Tabelle involviert, muss gejoint werden.

  • Natural Join nur, wenn die Bezeichner gleich sind.

Template

SELECT Pat_Name, Pat_Vorname, Pat_GebDatum
FROM Patient
SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EnlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, (enthalten-auf) as Dauer 
SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EnlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, (enthalten-auf) as Dauer 
FROM (((Patient_Aufenthalt as PatAuf 
INNER JOIN Zimmer as Z ON PatAuf.PatAuf_ZID = Z.Z_ID) 
INNER JOIN Station as S ON Z_StatId = S.Stat_ID) 
INNER JOIN Bett as B ON Z.Z_BettID = B.Bett_ID)
SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EnlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, (enthalten-auf) as Dauer 
FROM (((Patient_Aufenthalt as PatAuf 
INNER JOIN Zimmer as Z ON PatAuf.PatAuf_ZID = Z.Z_ID) 
INNER JOIN Station as S ON Z_StatId = S.Stat_ID) 
INNER JOIN Bett as B ON Z.Z_BettID = B.Bett_ID)
SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EnlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, (enthalten-auf) as Dauer 
FROM (((Patient_Aufenthalt as PatAuf 
INNER JOIN Zimmer as Z ON PatAuf.PatAuf_ZID = Z.Z_ID) 
INNER JOIN Station as S ON Z_StatId = S.Stat_ID) 
INNER JOIN Bett as B ON Z.Z_BettID = B.Bett_ID)
SELECT Bett_Nummer 
From Bett

WHERE

  • WHERE ist ein Filter!

  • Daten können ausgefiltert, oder eingefiltert werden.

Template

SELECT Name FROM Personen
WHERE Name like "W%";

Eingefiltert, was soll angezeigt werden

SELECT Name FROM Personen
WHERE Name not like "W%";

Ausgefiltert, was soll nicht angezeigt werden

SELECT Pat_Name, Pat_Vorname, Pat_GebDatum
FROM Patient
SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EnlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, 
(ent-auf)  
as Dauer 
FROM ...
WHERE (Month(PatAuf_AufnahmeDatum) = 2 AND Year(PatAuf_AunahmeDatum) = 2020) OR
(Month(PatAuf_EnlassDatum) = 2 AND Year(PatAuf_EntlassDatum) = 2020);

Where waren (nur) 4 Punkte

SELECT Bett_Nummer FROM Betten
SELECT Bett_Nummer FROM Betten

Gedöns

... ORDER BY, GROUP BY ....

SELECT Pat_Name, Pat_Vorname, Pat_GebDatum
FROM Patient
ORDER BY Pat_GebDatum DESC
SELECT Pat_Name, Pat_Vorname, Pat_GebDatum
FROM Patient
ORDER BY Pat_GebDatum DESC, Pat_Name ASC
SELECT Pat_Name, Pat_Vorname, Pat_GebDatum
FROM Patient
ORDER BY Pat_GebDatum DESC, Pat_Name ASC, Pat_Name DESC;

GROUP By nur bei Aggretatfunktionen

SELECT PatAuf_AufnahmeDatum as auf, PatAuf_EnlassDatum as ent,Z_Zimernummer, Stat_Station, Bett_Nummer, 
(ent-auf)  
as Dauer 
FROM ...
WHERE (Month(PatAuf_AufnahmeDatum) = 2 AND Year(PatAuf_AunahmeDatum) = 2020) OR
(Month(PatAuf_EnlassDatum) = 2 AND Year(PatAuf_EntlassDatum) = 2020);

Merke

Bei Aggregatfunktionen müssen alle Werte in die GROUP BY Klausel, die Werte aus Tabellen sind.

Werte Aggregieren

SELECT Kunde.`Kunde_ID`, 
COUNT(Rechnung.`Rg_KdID`) AS AnzahlRechnungen
FROM Rechnung JOIN Kunde on Rechnung.`Rg_KdID` = Kunde.`Kunde_ID`
GROUP BY Kunde.`Kunde_ID`
ORDER By AnzahlRechnungen DESC;

versus

SELECT Kunde.`Kunde_ID`, 
    (SELECT COUNT(Rechnung.`Rg_KdID`) AS AnzahlRechnungen 
     FROM Rechnung WHERE 
     Rechnung.`Rg_KdID` = Kunde.`Kunde_ID`) AS AnzahlRechnungen
FROM Kunde
ORDER By AnzahlRechnungen DESC;

Prüfungsvorbereitung

FI04