PMG/Kurs 11/D Beleg/Stefanie
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>SQL</language>
==Erstellen einer Datenbank==
<br>
Hier kannst du mitverfolgen, wie eine Datenbank ensteht. Mein Thema: '''Blutspenderkartei'''
<br>
Zur Blustspende gehen jählich rund 4 Millionen Menschen. Diese werden in die Blutspenderkartei aufgenommen. Diese Kartei ist - wie man sich schon denken kann - eine Datenbank. Und wie man eine solche erstellt, werde ich jetzt zeigen.
<br>
<br>
Zuerst erstellen wir ein '''ER-Modell'''('''E'''ntity-'''R'''elationship-Modell). Dazu über überlegen wir zunächst, welche Daten für die Bluspenderdatei wichtig sein könnten.
<br>
<br>Das ER-Modell könnte in etwa so aussehen:
<br>
[[Bild:Corona_Blutspenderkartei_ER.jpeg|left|500px]]
<br>
<br><br><br><br><br><br><br><br><br><br><br><br><br>
Nachdem wir das nun haben, formen wir aus dem ER-Modell Tabellen. Jede Entität wird zur Tabelle, oder auch Relation, jedes Attribut wird zu einer Spalte.
<br><br>
'''Tabelle Spender:''' <br>
{| border="1"
|-
|Name || Geburtsjahr || Adresse || Blut
|-
|Hans Meier || 1956 || Blumenweg 7, 05678 Auendorf|| AB Positiv
|-
|Ilse Meier || 1960 || Blumenweg 7, 05678 Auendorf|| A Positiv
|-
|Maria Schulze || 1973 || Mozartstraße 19, 05496 Himmelreich|| 0 Negativ
|-
|Andreas Liebsch || 1988 || Am Bach 21, 05673 Hemmingen|| A Negativ
|-
|Michael Goldmann || 1979 || Blumenweg 15, 05678 Auendorf|| B Positiv
|}
<br>
'''Tabelle Krankenhaus:''' <br>
{| border="1"
|-
|Name || Adresse
|-
|Stankt Marienstern Krankenhaus|| Liebknechtstraße 22, 05678 Auendorf
|-
|Alexander Fleming Krankenhaus|| Kirchhofstraße 9, 05496 Himmelreich
|-
|Uniklinikum Hemmingen|| Köhlerweg 5, 05673 Hemmingen
|-
|}
<br><br>
In diesen Tabellen sind jetzt einige Angaben, die man so nicht lassen kann, weil sie nicht '''atomar''' sind. Zum Beispiel ''Adresse'': Angenommen, man will wissen, welche Spender in Auendorf wohnen, ist das nicht möglich, da der Computer das nicht erkennen kann.<br>
Teilt man aber das Attribut ''Adresse'' in ''Straße'' und ''Ort'' auf, ist die Suche möglich. Wenn man alle Daten einzeln stellt, nennt man das die '''erste Normalisierung''' oder '''erste Normalform'''.<br>
<br>
{| border="1"
|-
|Vorname || Name || Geburtsjahr || Straße|| PLZ || Ort || Blutgruppe || Rhesusfaktor
|-
|Hans || Meier || 1956 || Blumenweg 7 || 05678 || Auendorf || AB || Positiv
|-
|Ilse || Meier || 1960 || Blumenweg 7 || 05678 || Auendorf || A || Positiv
|-
|Maria || Schulze || 1973 || Mozartstraße 19 || 05496 || Himmelreich|| 0 || Negativ
|-
|Andreas || Liebsch || 1988 || Am Bach 21 || 05673 || Hemmingen|| A || Negativ
|-
|Michael || Goldmann || 1979 || Blumenweg 15|| 05678 || Auendorf|| B || Positiv
|}
<br>
{| border="1"
|-
|Name || Straße || PLZ || Ort
|-
|Stankt Marienstern Krankenhaus|| Liebknechtstraße 22 || 05678 || Auendorf
|-
|Alexander Fleming Krankenhaus|| Kirchhofstraße 9 || 05496 || Himmelreich
|-
|Uniklinikum Hemmingen|| Köhlerweg 5 || 05673 || Hemmingen
|-
|}
<br><br>
In der '''zweiten Normalform''' ist eine Tabelle dann, wenn alle Eingaben atomar sind (also einzeln stehen -> erste Normalform) und wenn alle Attribute vom '''Primärschlüssel''' abhängig sind. Dieser Primärschlüssel muss für jeden Spender und jedes Krankenhaus festgelegt werden. Hier nehmen wir die Spender- und die Krankenhaus-ID.<br>
[[Bild:Corona_Blutspenderkartei_ER.jpeg|left|500px]]
Von diesen Primärschlüsseln sind alle Attribute bereits abhängig, es müssen also keine weiteren Veränderungen gemacht werden.<br>
Doch, wie man mit einem Blick auf das ER-Modell feststellen kann, fehlen noch ein paar Daten. Also muss noch eine weitere Tabelle Spendet erstellt werden.<br>
<br>
{| border="1"
|-
|Spender-ID || Vorname || Name || Geburtsjahr || Straße|| PLZ || Ort || Blutgruppe || Rhesusfaktor
|-
|001 || Hans || Meier || 1956 || Blumenweg 7 || 05678 || Auendorf || AB || Positiv
|-
|002 || Ilse || Meier || 1960 || Blumenweg 7 || 05678 || Auendorf || A || Positiv
|-
|003 || Maria || Schulze || 1973 || Mozartstraße 19 || 05496 || Himmelreich|| 0 || Negativ
|-
|004 || Andreas || Liebsch || 1988 || Am Bach 21 || 05673 || Hemmingen|| A || Negativ
|-
|005 || Michael || Goldmann || 1979 || Blumenweg 15|| 05678 || Auendorf|| B || Positiv
|}
<br>
{| border="1"
|-
|Krankenhaus-ID || Name || Straße || PLZ || Ort
|-
|583 || Stankt Marienstern Krankenhaus|| Liebknechtstraße 22 || 05678 || Auendorf
|-
|561 || Alexander Fleming Krankenhaus|| Kirchhofstraße 9 || 05496 || Himmelreich
|-
|549 || Uniklinikum Hemmingen|| Köhlerweg 5 || 05673 || Hemmingen
|-
|}
<br>
'''Tabelle Spendet:''' <br>
{| border="1"
|-
|Krankenhaus-ID || Spender-ID|| Datum
|-
|583 || 001|| 23. 7. 2011
|-
|583 || 002|| 23. 7. 2011
|-
|583 || 005|| 8. 8. 2011
|-
|561 || 003|| 30. 9. 2011
|-
|549 || 004|| 2. 5. 2012
|-
|}
<br>
<br>
Damit eine Tabelle in der '''dritten Normalform''' ist, muss sie die Bedingungen der zweiten Normalform aufweisen und alle Attribute müssen von einem Schlüsselattribut abhängen. Auch das ist bei uns schon gegeben. (Besser zu sehen [http://www.tinohempel.de/info/info/datenbank/normalisierung.htm hier].)
<br><br>
Jetzt muss nur noch die Datenbank erstellt werden.<br><br>
<code id="9ad5ec248vbf5">
DROP TABLE IF EXISTS spender;
CREATE TABLE spender (
Spender_ID varchar(3),
Vorname varchar (20),
Nachname varchar (20),
Geburtsjahr varchar (4),
Straße varchar (20),
PLZ varchar (5),
Ort varchar (20),
Blutgruppe varchar (2),
Rhesusfaktor varchar (20),
PRIMARY KEY (Spender_ID)
);
INSERT INTO spender VALUES ('001', 'Hans', 'Meier', '1956', 'Blumenweg 7', '05678', 'Auendorf', 'AB', 'Positiv');
INSERT INTO spender VALUES ('002', 'Ilse', 'Meier', '1960', 'Blumenweg 7', '05678', 'Auendorf', 'A', 'Positiv');
INSERT INTO spender VALUES ('003', 'Maria', 'Schulze', '1973', 'Mozartstraße 19', '05496', 'Himmelreich', '0', 'Negativ');
INSERT INTO spender VALUES ('004', 'Andreas', 'Liebsch', '1988', 'Am Bach 21', '05673', 'Hemmingen', 'A', 'Negativ');
INSERT INTO spender VALUES ('005', 'Michael', 'Goldmann', '1979', 'Blumenweg 15', '05678', 'Auendorf', 'B', 'Positiv');
DROP TABLE IF EXISTS krankenhaus;
CREATE TABLE krankenhaus (
Krankenhaus_ID varchar (3),
Name varchar (40),
Straße varchar (20),
PLZ varchar (5),
Ort varchar (20),
PRIMARY KEY (Krankenhaus_ID)
);
INSERT INTO krankenhaus VALUES ('583', 'Sankt Marienstern Krankenhaus', 'Liebknechtstraße 22', '05678', 'Auendorf');
INSERT INTO krankenhaus VALUES ('561', 'Alexander Fleming Krankenhaus', 'Kirchhofstraße 9', '05496', 'Himmelreich');
INSERT INTO krankenhaus VALUES ('549', 'Uniklinikum Hemmingen', 'Köhlerweg 5', '05673', 'Hemmingen');
DROP TABLE IF EXISTS spendet;
CREATE TABLE spendet (Krankenhaus_ID varchar (3),
Spender_ID varchar (3),
Datum varchar(10),
);
INSERT INTO spendet VALUES ('583', '001', '03.04.2012');
INSERT INTO spendet VALUES ('583', '002', '03.04.2012');
INSERT INTO spendet VALUES ('583', '005', '05.04.2012');
INSERT INTO spendet VALUES ('583', '005', '12.09.2012');
INSERT INTO spendet VALUES ('561', '003', '19.03.2012');
INSERT INTO spendet VALUES ('561', '003', '27.07.2012');
INSERT INTO spendet VALUES ('549', '004', '29.11.2012');
</code>
<run id="9ad5ec248vbf5">
SELECT *
FROM spender;
SELECT *
FROM krankenhaus;
SELECT *
FROM spendet;
</run>
<br><br>
Hier stelle ich noch ein paar Abfragen ein. Viel Spaß mit der Datenbank.<br><br>
<run id="9ad5ec248vbf5">
SELECT Name, Straße, Ort
FROM krankenhaus
WHERE Ort like 'Auendorf'
;
</run>
<br><br>
<run id="9ad5ec248vbf5">
SELECT Vorname, Nachname, Geburtsjahr
FROM spender
WHERE Geburtsjahr > '1970';
</run>
<br><br>
<run id="9ad5ec248vbf5">
SELECT *
FROM spender, spendet
WHERE spender.Spender_ID = spendet.Spender_ID;
</run>
<br><br>
<run id="9ad5ec248vbf5">
SELECT Vorname, Nachname, Blutgruppe, Rhesusfaktor
FROM spender
WHERE Blutgruppe = 'A' OR Rhesusfaktor = 'Positiv'
ORDER BY Blutgruppe ASC;
</run>