Totaler Anfänger - paar Fragen

Gary12345

Benutzer
Beiträge
14
Hallo,

ich besuche die 9te Klasse eines Gymnasiums und versuche mir SQL selber beizubringen, da mir das gefällt und ich das auch in der Schule können muss. Da wir in gut 3 Wochen eine Arbeit schreiben, will ich unbedingt mit selbst SQL aneignen und natürlich auch eine gute Note erzielen. Rein privat programmiere ich in Python und in XPROFAN (damit habe ich aber zurzeit aufgehört).

Es handelt sich um eine Aufgabe, die wir demnächst im Unterricht korregieren werden, die dazu verhilft, eine eigene Datenbank zu erstellen, zu planen und richtig zu strukturieren.

Es ist nicht so, dass ich nichts verstehe , sondern will wissen, ob mein Gedankengang richtig ist.

Aufgabe:
In einer Stadt gibt es mehrere Videotheken XVIEW (Tel 12345), YVIEW(Tel 56789) und ZVIEW(Tel 192837). XVIEW liegt in Xantipelleallee, YVIEW in Ypsweg und ZVIEW in der Zeppelinstraße. Jede Videothek wird von genau einem Mitarbeiter geleitet. Dabei haben alle Leiter von Videotheken unterschiedliche Namen, einen Vornamen und ein Gehalt.
Jede Videothek vertreibt mehrere Filme aber immer nur eines bestimmten Genres: XVIEW - Abenteuerfilme, YVIEW - Märchenfilme und ZVIEW - Musikfilme. Jeder dieser Filme hat eine Kurzbezeichnung und einen Herstellert. Von einem Film stehen in einer Videothek mehrere Exemplare zur Ausleihe bereit. Kunden mit Namen und Vornamen können sich in der Videothek ein oder mehrere Filme ausleihen.

1. Erstelle ein ER-Diagramm
- dazu gehört: Entitäten mit Attributen, Relationen, Kardinalitäten, Primärschlüssel


f9d7uckd.png



Das habe ich bereits meinem Lehrer gezeigt. Er hatte mir Recht gegeben. Daher denke ich auch, dass das so OK ist.

2. Erstelle ein Datenbankschema!
- dazu gehört: Tabellenentwurf für Entitäten und Relationen
- Tabellenname, Attribut-Spaltennamen mit Typ, Primär-/Sekundärschlüssel

Meine dazugehörige Lösung (da bin ich mir etwas unsicher):

rot = Primärschlüssel blau = importierter Fremdschlüssel

Mitarbeiter(Name : Varchar(30); Gehalt : Int; Vorname : Varchar(30))
Videothek(Telefonnr : Int; Ort : Varchar(20); Name2 : Varchar(30); Name : Varchar(30))
Filme(Kurzbezeichnung : Varchar(20); Hersteller : Varchar(30); Genre : Varchar(20); Telefonnr : Int)
Kunden(ID : Int; Vorname : Varchar(20); Name: Varchar(20); Kurzbezeichnung : Varchar(20))
Verleihen(Kurzbezeichnung : Varchar(20); ID : Int)

Nun - ich habe die für die Relation "Verleihen" eine Tabelle erstellt, weil es eine n:m Beziehung ist, dass heist, dass keine Vereinfachung möglich ist.

Dabei wäre meine Frage, ob dies richtig ist.

3. Verfeinere das Datenbankschema!
- Verfeinerung von 1:1
- Verfeinerung von 1:n
- sinnvoller Import der Sekundärschlüssel

In Aufgabe 2 schon gemacht. Jedoch frage ich mich, ob ich die Sekundärschlüssel richtig importiert habe und was der Begriff "Sekundärschlüssel" eigentlich bedeutet.

4. Setze das verfeinerte Datenbankschema in eine Datenbank mit SQL um!

Dabei habe ich all diese Tabellen angelegt (Genau nach den Datenbankschema), jedoch weiss ich nicht, wie ich den "Code" abrufen kann, mit dem ich diese Datenbank erstellt habe.

Wie kann man den Code einsehen?

5. Fülle Deine Tabellen mit mindestens 5 Einträgen.

Da ich blöderweise dazu ein Arbeitsblatt verloren habe, wusste ich nicht wie man Daten mit Hilfe eines Scripts einfügen kann. Deshalb habe ich die Datenbank geöffnet und habe dabei einen Eintrag eingetragen.Da ich wieder nicht auf die Idee gekommen bin, nach den richtigen Befehlen zu googlen, werde ich es natürlich demnächst machen!

Wenn ich den Eintrag in die Tabelle Mitarbeiter einfüge, müsste doch dieser Schlüssel doch auch in der Tabelle Videothek sein, weil ich den Schlüssel der Datenbank Mitarbeiter ind die Datenbank Videothek importiert habe? -> Schlüssel nicht zu sehen
Ich denke zwar, dass ich weiss, wass "Fremdschlüssel importieren" bedeutet, jedoch will ich auf Nummer sicher gehen und diese Sache von einem Profi erklären lassen.

Eine Frage, die nicht zur Aufgabe gehört:
Es geht um das Thema Kardinalitäten. Jetzt unterrichten n Lehrer m Klassen. Ist das dann auch gleich, wenn man das m Lehrer nennt wie z.B. Jetzt unterrichten m Lehrer n Klassen. Schon, oder?

Das wars vorerst! Freue mich auf Antwort!

Liebe Grüße
-Gary
 
Werbung:
Hallo,

ich besuche die 9te Klasse eines Gymnasiums und versuche mir SQL selber beizubringen, da mir das gefällt und ich das auch in der Schule können muss.

Löblich, von der Wahl der DB mal abgesehen, aber das ist sicher nicht Deine Entscheidung ;-)


2. Erstelle ein Datenbankschema!
- dazu gehört: Tabellenentwurf für Entitäten und Relationen
- Tabellenname, Attribut-Spaltennamen mit Typ, Primär-/Sekundärschlüssel

Meine dazugehörige Lösung (da bin ich mir etwas unsicher):

rot = Primärschlüssel blau = importierter Fremdschlüssel

Mitarbeiter(Name : Varchar(30); Gehalt : Int; Vorname : Varchar(30))
Videothek(Telefonnr : Int; Ort : Varchar(20); Name2 : Varchar(30); Name : Varchar(30))

Das Name in Videothek soll dann auf den Mitarbeiter referenzieren, oder? Okay. Telefonnummer aber nicht als INT, weil die können auch Leerzeichen,/, + etc. enthalten.
Man kann, muß aber nicht, den Mitarbeitern eine num. ID geben und diese als Schlüssel verwenden.

Filme(Kurzbezeichnung : Varchar(20); Hersteller : Varchar(30); Genre : Varchar(20); Telefonnr : Int)
Telefonnummer? Vermutlich willst Du Angaben zum hersteller etc. speichern, hier wäre eine extra Tabelle besser, denn ein Hersteller hat oft mehr als 1 Film, oder?

Kunden(ID : Int; Vorname : Varchar(20); Name: Varchar(20); Kurzbezeichnung : Varchar(20))
Verleihen(Kurzbezeichnung : Varchar(20); ID : Int)

Wie bildest Du ab, welcher Kunde nun welchen Fim hat? Bezieht sich Kurzbezeichnung in verleihen nun auf Kunden oder auf Filme?
Wie bildest Du mehrere gleiche Filme ab?
Wie bildest Du ab, welches Genre welche Videothek hat?

Dabei habe ich all diese Tabellen angelegt (Genau nach den Datenbankschema), jedoch weiss ich nicht, wie ich den "Code" abrufen kann, mit dem ich diese Datenbank erstellt habe.

Wie kann man den Code einsehen?

MySQL und andere DB's haben dazu Clients, wo man z.B. reine Textdateien mit den Anweisungen reinkippen kann.

5. Fülle Deine Tabellen mit mindestens 5 Einträgen.

Da ich blöderweise dazu ein Arbeitsblatt verloren habe, wusste ich nicht wie man Daten mit Hilfe eines Scripts einfügen kann. Deshalb habe ich die Datenbank geöffnet und habe dabei einen Eintrag eingetragen.Da ich wieder nicht auf die Idee gekommen bin, nach den richtigen Befehlen zu googlen, werde ich es natürlich demnächst machen!

Nur heute kostenfrei, der Google-Service: Insert

Wenn ich den Eintrag in die Tabelle Mitarbeiter einfüge, müsste doch dieser Schlüssel doch auch in der Tabelle Videothek sein, weil ich den Schlüssel der Datenbank Mitarbeiter ind die Datenbank Videothek importiert habe? -> Schlüssel nicht zu sehen
Ich denke zwar, dass ich weiss, wass "Fremdschlüssel importieren" bedeutet, jedoch will ich auf Nummer sicher gehen und diese Sache von einem Profi erklären lassen.

In Mitarbeiter ist Name als PK definiert, in Videothek als Fremdschlüssel. Sofern Du bei MySQL die richtige Storage-Engine ausgewählt und die Syntax richtig hast, würde mit viel Glück dann MySQL prüfen, daß in Videothek im Feld Namen nur Werte vorkommen, die in Mitarbeiter definiert sind. Das nennt sich referentielle Integrität und wurde bei MySQL erst sehr spät erfunden.

Kurzdemo:
Code:
test=# create table mitarbeiter(name text primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mitarbeiter_pkey" for table "mitarbeiter"
CREATE TABLE
Time: 100,339 ms
test=*# create table videothek(mitarbeiter_name text references mitarbeiter);
CREATE TABLE
Time: 54,764 ms
test=*# insert into mitarbeiter values ('Max');
INSERT 0 1
Time: 0,421 ms
test=*# insert into videothek values ('Max');
INSERT 0 1
Time: 14,780 ms
test=*# insert into videothek values ('Moritz');
ERROR:  insert or update on table "videothek" violates foreign key constraint "videothek_mitarbeiter_name_fkey"
DETAIL:  Key (mitarbeiter_name)=(Moritz) is not present in table "mitarbeiter".
Time: 0,437 ms

Achtung MySQL-Falle: MySQL akzeptiert den Code exakt auch so (create table - Befehle) und auch BEIDE Insert-Befehle in videothek. Die Syntax von mir ist 100% SQL-konform und funktioniert überall wie erwartet - außer in MySQL. Da mußt Du (sofern nicht 5.5 oder besser) expliziert InnoDB sagen und b) den Fremdschlüssel in der anderen Syntax definieren.
Wenn Du das so machst wie ich wird MySQL die referentielle Integrität NICHT PRÜFEN.


Ich sag mal so: man sieht, Du hast Dir Gedanken gemacht, aber noch nicht alles bedacht. Das wird schon ;-)
 
Hi,

Löblich, von der Wahl der DB mal abgesehen, aber das ist sicher nicht Deine Entscheidung ;-)

Ich denke, ich habe einer der größten Fehler gemacht. Wenn ich jetzt mal Deinen Quellcode ansehe, verstehe ich 0. Wenn ich jedoch in dem Forum "Microsoft Server SQL" nachsehe, verstehe ich viel mehr. Ich denke, es kann gut sein, dass ich in der falschen Sektion bin. Aber : Uns wurde nur SQL gesagt, weder Microsoft Server SQL noch MySQL. Schließlich hies es: Wir programmieren jetzt in SQL. Kein weiteres Wort. Sehr hilfreich ist es schon, wenn man die Wichtigkeit von SQL erstmal verstehen muss! Ich kenne sehr viel Programmierer, die mit Python SQL programmieren (mit Hilfe eines Moduls) und daher interessiert es mich auch. Nicht nur wegen Python. Es ist halt viel einfacher, Daten zu managen. Das Problem ist nur wie man solche Datenbank "managt". Da ich ein ehrlicher Mensch bin, habe ich mich im ersten Halbjahr verschlechtert, stehe momentan auf eine 4 (!). Das ist aber auch nur wegen mir passiert, da ich einfach zu faul war und mir das damalige Thema "Tabellenkalkulationssysteme" gar nicht interessiert hatte. Aber ich freu mich (ehrlichgesagt) nächstes Jahr auf Java.

Zu Aufgabe2)

Ja, der Name in der Datenbank Videothek wird importiert aus der Mitarbeiter Datenbank. Somit referenziert Name der Datenbank Videothek den Namen aus Mitarbeiter. Man könnte dann Telefonnr als Varchar abspeichern? Und ja, man kann natürlich einen künstlichen Schlüssel erzeugen, jedoch denke ich, dass der natürliche Primärschlüssel "Name" auch ausreicht.

Telefonnummer? Vermutlich willst Du Angaben zum hersteller etc. speichern, hier wäre eine extra Tabelle besser, denn ein Hersteller hat oft mehr als 1 Film, oder?
Da hast Du recht.

Wie bildest Du ab, welcher Kunde nun welchen Fim hat? Bezieht sich Kurzbezeichnung in verleihen nun auf Kunden oder auf Filme?
"Kurzbezeichnung" befindet sich ja in der Datenbank Film. In der Datenbank Kunden wir der Schlüssel "Kurzbezeichnung" doch importiert, oder nicht? Und durch diese Kurzbezeichnung bilde ich ab, welche Filme welcher Kunde besitzt. => Daher bezieht sich Kundenbezeichnung auf Kunde und auf Film?!

Wie bildest Du mehrere gleiche Filme ab?
Wie bildest Du ab, welches Genre welche Videothek hat?

Das ist das Problem. Ich weiss nicht wie.

In Mitarbeiter ist Name als PK definiert, in Videothek als Fremdschlüssel. Sofern Du bei MySQL die richtige Storage-Engine ausgewählt und die Syntax richtig hast, würde mit viel Glück dann MySQL prüfen, daß in Videothek im Feld Namen nur Werte vorkommen, die in Mitarbeiter definiert sind. Das nennt sich referentielle Integrität und wurde bei MySQL erst sehr spät erfunden.

OK

Ich sag mal so: man sieht, Du hast Dir Gedanken gemacht, aber noch nicht alles bedacht. Das wird schon ;-)

Ich mache mir sehr viele Gedanken. Die Umwandlung in Praxis holpert noch etwas.

Da wir ja nicht wissen, welches SQL ich benutze, füge ich hier einen kleinen Beispielcode ein, der eine Tabelle erstellt:

Code:
create table schueler(
schuelernr int not null primary key,
name varchar(20),
geb_am date
);

Falls das wirklich das falsche SQL ist, tut es mir furchtbar leid.

Schöne Grüße aus Bayern
-Gary
 
Da wir ja nicht wissen, welches SQL ich benutze, füge ich hier einen kleinen Beispielcode ein, der eine Tabelle erstellt:

Code:
create table schueler(
schuelernr int not null primary key,
name varchar(20),
geb_am date
);

Falls das wirklich das falsche SQL ist, tut es mir furchtbar leid.

Dir muß nix Leid tun, warum auch? Das funktioniert sowohl in MySQL (was Du vermutlich nutzt) und auch in PostgreSQL. Vermutlich auch in Oraggle und M$SQL und SQLite.

MySQL ist halt in manchen Dingen arger Murks, da es z.T. Dinge, die der SQL-Standard definiert, auch so annimmt, aber sich einen Dreck drum schert, das zu realisieren.

Code:
Your MySQL connection id is 12465865
Server version: 5.1.67 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create table foobar(i int check i < 10);
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foobar values (22);
Query OK, 1 row affected (0.06 sec)

In PostgreSQL :

Code:
test=*# create table foobar(i int check (i < 20));
CREATE TABLE
Time: 36,025 ms
test=*# insert into foobar values (22);
ERROR:  new row for relation "foobar" violates check constraint "foobar_i_check"
DETAIL:  Failing row contains (22).
Time: 25,031 ms


Was nützt es, wenn die DB die korrekte Syntax zur Prüfung auf < Wert zwar akzeptiert, das aber dann ignoriert?

Andreas, grad wenig Zeit ...
 
Hi,

Ist eigentlich schon ziemlich blöd, wenn man nicht weiss, welches SQL man nutzt. Und dazu auch in LibreOffice Base wird nur SQL angegeben. Das ist verwirrend.

Werde jetzt paar Tutorials abrattern, werde mich demnächst wieder melden, möchte aber dennoch gerne das Kapitel Objektorientierte Programmierung mit Python abschließen.

Vielen Dank bis dahin!
 
Wenn ich schon die Tuts ansehe wird mir schon schlecht, da haben wir ja nicht mal 1/4 besprochen. Mal sehen, ob ich das Importieren von Fremdschlüsseln wirklich verstehe.
 
Jetzt sollte man sich Gedanken machen, wie und wo man Fremdschlüssel importiert. Habe nun ein schöneres ER-Daigramm gestaltet:
ojukkj4q.png


Wir haben gelernt, dass man bei 1:1 und bei 1:n - Beziehungen die Relationstabellen weglassen kann, indem man Fremdschlüssel importiert. Bei einer n:m Beziehung eben nicht. Das würde bedeuten, dass ich die Relationstabelle "Verleiht" erstellen muss.

Zuerst erstelle ich die erste Tabelle mit diesem Code (die Mitarbeitertabelle):
Code:
create table Mitarbeiter (
Name Varchar(30) not null primary key,
Gehalt int,
Vorname Varchar(30)
);

Der Code funktioniert. Nun habe ich die Tabelle Mitarbeiter mit den drei Attributen erstellt, eine davon ist der Primärschlüssel. Um die Relationstabelle zu vermeiden müsste ich doch den Primärschlüssel "Name" der Datenbank "Mitarbeiter" als Fremdschlüssel in die Datenbank "Videothek" importieren? Danach kann ich genau festlegen, welcher Mitarbeiter welche Videothek leitet? Habe ich recht?

Der Code wäre dann:

Code:
create Table Videothek (
Telefonnr int not null primary key,
ort varchar(30),
name_videothek varchar(30),
name varchar(30),
foreign key name references Mitarbeiter(name)
);

Dieser Code veranschaulicht, dass mit Hilfe der Funktion (ist das überhaupt eine Funktion?) ein Fremdschlüssel importiert wird. In diesem Fall wird der Schlüssel name aus der Tabelle Mitarbeiter importiert.

Soweit richtig?

Gehen wir mal lieber alles Schritt für Schritt an.
 
Dieser Code veranschaulicht, dass mit Hilfe der Funktion (ist das überhaupt eine Funktion?) ein Fremdschlüssel importiert wird. In diesem Fall wird der Schlüssel name aus der Tabelle Mitarbeiter importiert.

Soweit richtig?

Gehen wir mal lieber alles Schritt für Schritt an.

Das ist keine Funktion, sondern eine Definition. Da wird auch nix importiert, sondern der Datenbank gesagt, daß sie zu prüfen hat, daß es einen gleichen Eintrag in der Mitarbeiter-Tabelle zu geben hat.

Andreas
 
Und wurde gesagt, dass man mit der Definition (?) ForEign Key einen Fremdschlüssel aus einer anderen Tabelle importiert. Und wenn man dann in die Tabelle Mitarbeiter Werte einträgt, dann sollte es doch in der Tabelle Videothek auch den Wert name geben, da ich ihn ja importiert habe? Ich denke, ich versteh nicht so richtig, was importieren in SQL bedeutet.
 
Und wurde gesagt, dass man mit der Definition (?) ForEign Key einen Fremdschlüssel aus einer anderen Tabelle importiert. Und wenn man dann in die Tabelle Mitarbeiter Werte einträgt, dann sollte es doch in der Tabelle Videothek auch den Wert name geben, da ich ihn ja importiert habe? Ich denke, ich versteh nicht so richtig, was importieren in SQL bedeutet.

Ich erstelle 2 Tabellen, master und slave. Master hat einen PK, slave einen Foreign Key auf master.
Ich füge in master einen Wert ein und gugge, was dann in master und in slave steht:

Code:
test=# create table master(name text primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
CREATE TABLE
test=*# create table slave (name text references master);
CREATE TABLE
test=*# insert into master values ('max');
INSERT 0 1
test=*# select * from master;
 name
------
 max
(1 row)

test=*# select * from slave;
 name
------
(0 rows)

Nun füge ich 2 Werte in slave ein, beachte bitte die Reaktion der DB:

Code:
test=*# insert into slave values ('max');
INSERT 0 1
test=*# insert into slave values ('moritz');
ERROR:  insert or update on table "slave" violates foreign key constraint "slave_name_fkey"
DETAIL:  Key (name)=(moritz) is not present in table "master".


Nun a bissl klarer?


Andreas
 
Ich benutze LibreOffice Base und will Deinen Code da einfügen. Leider kommt eine Fehlermeldung: 1: Unexpected token: TEST in statement [test]

Liegt es an MYSQL? Kennst Du ein gutes Einsteiger Tutorial?
 
Ich benutze LibreOffice Base und will Deinen Code da einfügen. Leider kommt eine Fehlermeldung: 1: Unexpected token: TEST in statement [test]

Liegt es an MYSQL? Kennst Du ein gutes Einsteiger Tutorial?

Oh mann...

Code:
test=#

ist jeweils der Prompt der Datenbank. Meine Befehle sind immer die SQL-Befehle wie create table ... und select *.

Andreas
 
Guten Tag,

es tut mir leid, dass ich mich blöd anstelle, jedoch versuche ich Deinen Code zu interpretieren und in MySQL Code umzuwandeln.
Code:
test=# create table master(name text primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
CREATE TABLE
test=*# create table slave (name text references master);
CREATE TABLE
test=*# insert into master values ('max');
INSERT 0 1
test=*# select * from master;
name
------
max
(1 row)
 
test=*# select * from slave;
name
------
(0 rows)
Zuerst wird eine Tabelle erstellt, wobei text wohl falsch ist. Richtig wäre Varchar. Die zweite Zeile empfinde ich als Kommentar und wird vom Interpreter übersprungen, oder doch nicht?
Und nach diesen Zeilen verstehe ich garnichts mehr.

Was da gemacht wird, haben wir nicht besprochen. Wir haben nur besprochen, wie man Tabellen abfrägt, wie man sie erstellt und wie man Fremdschlüssel importiert. Mehr nicht.
 
Werbung:
Guten Tag,

es tut mir leid, dass ich mich blöd anstelle, jedoch versuche ich Deinen Code zu interpretieren und in MySQL Code umzuwandeln.
Ich schreib mal mit -- beginnen Kommentare rein, okay?

Code:
test=# create table master(name text primary key);
-- ich gebe das ab dem create ein, text ist ein Datentyp analog varchar, nur kürzer. Gibt es auch in MySQL
--die folgenden 2 Zeilen sind zum einen der Hinweis, daß ein Index erstellt wird und zum anderen, daß die Tabelle erstellt wird
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "master_pkey" for table "master"
CREATE TABLE
-- der Prompt ändert sich nun von =# auf =*#, weil ich innerhalb einer Transaktion bin
-- ich erstelle eine weitere Tabelle, daß references master ist gültige SQL-Syntax, für MySQL mußt das als extra constraint definieren
-- MySQL würde diese Syntax kommentarlos akzeptieren, aber den Contraint verschlampen, FAIL eben
-- wie oben, kommt als Ausgabe der DB das CREATE TABLE als Bestätigung
test=*# create table slave (name text references master);
CREATE TABLE
-- nun geben ich via INSERT einen Einrag in die Tabelle, die DB bestätigt das mit INSERT 0 1, die Zahlen haben eine Bedeutung, aber das geht hier zu weit
test=*# insert into master values ('max');
INSERT 0 1
--nun mache ich ein select, die DB führt diesen aus und zeigt das Resultat
test=*# select * from master;
name
------
max
(1 row)
--noch ein select von mir
test=*# select * from slave;
name
------
(0 rows)

Zuerst wird eine Tabelle erstellt, wobei text wohl falsch ist. Richtig wäre Varchar. Die zweite Zeile empfinde ich als Kommentar und wird vom Interpreter übersprungen, oder doch nicht?
Falsch. Es ist noch eine Ausgabe der DB, keine Eingabe von mir.


Andreas
 
Zurück
Oben