Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
de:modul:m290_guko:learningunits:lu05:theorie:a_ddl [2026/09/13 20:44] – gkochde:modul:m290_guko:learningunits:lu05:theorie:a_ddl [2026/09/14 09:31] (aktuell) – gkoch
Zeile 1: Zeile 1:
-====== LU05a – SQL-DDL: Datenbanken & Tabellen anlegen und löschen ======+====== LU05a - Datentypen in MySQL ======
  
 ===== Lernziele ===== ===== Lernziele =====
-Sie lernen in dieser Lektion: +  * Ich kann erklären, warum jede Spalte einen Datentyp braucht. 
-  * wie Sie **Datenbanken** anlegen und löschen +  * Ich kenne die wichtigsten MySQL-Datentypen und weiss, wofür sie eingesetzt werden. 
-  * wie Sie darin **Tabellen** mit Spalten erstellen +  * Ich kann für eine gegebene Information den passenden Datentyp auswählen und meine Wahl begründen.
-  * wie Sie Tabellen auch wieder **löschen**+
  
-Diese Befehle gehören zur **Data Definition Language (DDL)** von SQL. 
  
 +===== Warum Datentypen? =====
 +In LU04 haben wir geplant, **welche** Tabellen und Spalten es geben soll. Bevor wir die Tabellen anlegen, müssen wir für jede Spalte festlegen, **welche Art von Werten** dort hineindarf.
  
 +Erinnern Sie sich an LU02: Beim Import von //imdb_top_1000// hat WebStorm **alle** Spalten als Text angelegt. Das hat Folgen:
  
-{{url>https://player.mux.com/i9xUpaKUB1jfD71N601Z4NLgmozCCF8nGxvk01jPQVNNE?metadata-video-title=Create+table+and+enter+values+in+Webstorm&video-title=Create+table+and+enter+values+in+Webstorm}} +<WRAP center box round 80%>
- +
-===== Datenbanken erstellen und löschen ===== +
- +
-Mit einer **Datenbank** schaffen Sie einen „Ordner“, in dem Sie Tabellen anlegen können.   +
-Hinweis: In **MySQL** sind *Database* und *Schema* Synonyme. In WebStorm (Database-Plugin) lautet der Menüpunkt **New → Schema**, er erstellt damit eine MySQL-Datenbank. +
- +
-<WRAP box center 80% round>  +
-**Datenbank erstellen:**+
 <code sql> <code sql>
-CREATE DATABASE mydb_perfect;+SELECT Series_Title, Meta_score 
 +FROM imdb_top_1000 
 +ORDER BY Meta_score DESC;
 </code> </code>
-//Bisher haben wir das in WebStorm per Rechtsklick auf die Verbindung → **New → Schema** gemacht (siehe Screenshot).// 
-{{de:modul:m290_guko:learningunits:lu05:theorie:screenshot_2025-09-14_at_14.29.02.png?direct&400|}} 
 </WRAP> </WRAP>
  
-**Mit Datenbanken arbeiten (USE)** +Diese Abfrage zeigt ganz oben Filme mit dem Wert **99** – obwohl es Filme mit **100** gibt. Der Grund: Text wird **alphabetisch** sortiert. Wie //Anna// vor //Berta// kommt, kommt //100// vor //99//, weil die 1 vor der 9 steht. Wäre die Spalte als Zahl angelegt, würde korrekt sortiert.
-In einem Datenbanksystem (z. B. MySQL) können mehrere **Datenbanken (Schemas)** nebeneinander existieren.   +
-Beispiel: Auf demselben MySQL-Server laufen z. B. die Datenbanken //digitech_ch// und //galaxus_ch// – sie liegen im gleichen System, verwalten ihre Daten aber **getrennt**.+
  
-Damit man weiss, **in welcher Datenbank man arbeitet**, muss man diese zuerst auswählen.   +Der richtige Datentyp sorgt also dafür, dass
-Das geschieht mit dem SQL-Befehl **USE**:+
  
-<WRAP box center 80% round>  +  * **richtig sortiert und gerechnet** wird, 
-**Auf eine Datenbank umschalten (Standard-Datenbank für SQL-Befehle aktiv setzen):** +  * **falsche Eingaben abgewiesen** werden (ein Geburtsdatum kann kein Text sein), 
-<code sql> +  * **Speicherplatz sinnvoll** genutzt wird und Abfragen schnell bleiben.
-USE mydb_perfect; +
-</code> +
-In WebStorm haben wir bisher die Datenbank über das **Drop-Down-Feld <Schema>** oben im Datenbank-Fenster ausgewählt.   +
-Der Befehl //USE// macht dasselbe – nur in SQL-Code-Form. +
-{{de:modul:m290_guko:learningunits:lu05:theorie:screenshot_2025-09-14_at_14.28.46.png?direct&400|}} +
-</WRAP>+
  
-Ab diesem Moment werden alle folgenden SQL-Befehle (z. B. //CREATE TABLE//, //SELECT//, //DROP TABLE//) in dieser Datenbank ausgeführt. 
  
 +===== Die wichtigsten Datentypen =====
  
 +Wir gehen nicht die ganze MySQL-Dokumentation durch, sondern die Typen, die Sie in diesem Modul tatsächlich brauchen. Als durchgehendes Beispiel dient eine **Bibliothek** mit einer Tabelle //buch//.
  
 +==== Zahlen ====
 +{{:de:modul:m290_guko:learningunits:lu03:theorie:number.png?nolink&80 }}
 +<WRAP center round box 80%>
 +^ Typ ^ Wofür ^ Beispiel in der Tabelle buch ^
 +| **INT** | Ganze Zahlen ohne Nachkommastellen | //seiten// (350), //buch_id// (1, 2, 3 …) |
 +| **DECIMAL(M,D)** | Kommazahlen mit **exakter** Genauigkeit. M = Stellen gesamt, D = Nachkommastellen | //preis// als DECIMAL(6,2) → bis 9999.99 |
 +| **FLOAT** / **DOUBLE** | Kommazahlen mit **ungefährer** Genauigkeit | Messwerte, Sensordaten – bei uns selten |
 +</WRAP>
  
-<WRAP box center 80% round>  +<WRAP center round important 80%> 
-**Datenbank löschen:** +**Geldbeträge immer DECIMAL, nie FLOAT.**\\ 
-<code sql> +FLOAT speichert Zahlen nur näherungsweise. Bei Preisen führt das zu Rundungsfehlern, die sich über viele Datensätze aufsummieren – in einer Rechnung fehlen dann plötzlich ein paar Rappen.
-DROP DATABASE mydb_perfect; +
-</code>+
 </WRAP> </WRAP>
  
-<WRAP box center 80% round>  +==== Text ==== 
-**Achtung:** //DROP DATABASE// löscht die **gesamte** Datenbank inkl. **aller** Tabellen und Daten. In produktiven Systemen nur nach Backup verwenden.+{{:de:modul:m290_guko:learningunits:lu03:theorie:string.png?nolink&80 }} 
 + 
 +<WRAP center round box 80%> 
 +^ Typ ^ Wofür ^ Beispiel in der Tabelle buch ^ 
 +| **VARCHAR(n)** | Text mit **variabler** Länge, bis n Zeichen. Der Normalfall für Text. | //titel// als VARCHAR(100) | 
 +| **CHAR(n)** | Text mit **immer gleicher** Länge | //isbn// als CHAR(13), Ländercodes wie CH oder FR | 
 +| **TEXT** | Sehr lange Texte ohne feste Obergrenze | Inhaltsangabe, Rezension |
 </WRAP> </WRAP>
  
 +Faustregel: **VARCHAR ist die Standardwahl.** CHAR nur, wenn die Länge wirklich immer gleich ist. TEXT nur für lange Fliesstexte.
  
 +==== Datum und Zeit ====
 +{{:de:modul:m290_guko:learningunits:lu03:theorie:date_time.png?nolink&80 }}
 +<WRAP center round box 80%>
 +^ Typ ^ Wofür ^ Format ^
 +| **DATE** | Nur ein Datum | 2026-09-07 (YYYY-MM-DD) |
 +| **TIME** | Nur eine Zeit | 14:30:00 (hh:mm:ss) |
 +| **DATETIME** | Datum **und** Uhrzeit | 2026-09-07 14:30:00 |
 +| **TIMESTAMP** | Wie DATETIME, kann sich beim Ändern eines Datensatzes automatisch aktualisieren | 2026-09-07 14:30:00 |
 +| **YEAR** | Ein Jahr | 1965 |
 +</WRAP>
 +Die Frage lautet immer: **Brauche ich die Uhrzeit?** Bei einem Erscheinungsdatum nicht (DATE), bei einer Ausleihe schon (DATETIME).
  
-===== Tabellen erstellen ===== +==== Ja oder Nein ==== 
-Wie wird nun in eine Datenbank eine Tabelle angelegt? +{{:de:modul:m290_guko:learningunits:lu03:theorie:boolean.png?nolink&80 }}
-Dazu gibt es in SQL die Anweisung //CREATE TABLE//, die eine Tabelle mit den dazugehörigen Spalten und deren Datentypen erzeugt. +
-Mit dem Befehl **CREATE TABLE** legen Sie eine Tabelle in der aktuell gewählten Datenbank an.+
  
-**Allgemeine Syntax:** +<WRAP center round box 80%> 
-<WRAP box center 80% round>  +^ Typ ^ Wofür ^ Werte ^ 
-<code sql> +| **BOOLEAN** | Genau zwei Zustände | true/false bzw. 1/0 |
-CREATE TABLE tabellenname ( +
-  spaltenname1 DATENTYP, +
-  spaltenname2 DATENTYP, +
-  ... +
-); +
-</code> +
-//**Wichtig**: nach der letzten Spalte wird __kein Kommma__ mehr geschrieben. Die drei Punkte (...) hier im Beispiel stehen für weitere Spalten.//+
 </WRAP> </WRAP>
  
  
 +Beispiel: //ausgeliehen// – ein Buch ist ausgeliehen oder nicht. MySQL speichert BOOLEAN intern als TINYINT, deshalb sehen Sie in der Tabelle 0 und 1.
  
-**Wichtige Namensregeln:** 
-  * Keine Leerzeichen, Umlaute oder Sonderzeichen 
-  * Nur Kleinbuchstaben 
-  * Tabellennamen müssen eindeutig sein 
  
 +===== Beispiel Buch =====
  
-===== Beispiel: Tabelle Student =====+{{:de:modul:m290_guko:learningunits:lu05:theorie:datentypen_book_small.png?direct&700|Buch mit Datentypen}}
  
-Wir wollen eine Tabelle **student** (Lernende:r) erstellen, die eine ID, den Vornamen, den Nachnamen und das Geburtsdatum speichert: +<WRAP center box round 80%> 
-<WRAP box center 80% round>  +^ Spalte ^ Datentyp ^ Warum? ^ 
-<code sql> +| buch_id | INT | Fortlaufende ganze Zahl | 
-CREATE TABLE student ( +| titel | VARCHAR(100) | Titel sind unterschiedlich lang | 
-  stundent_id INT, +| isbn | CHAR(13) | Eine ISBN hat immer genau 13 Stellen | 
-  name VARCHAR(50), +| seiten | INT | Ganze Zahl, keine halben Seiten | 
-  surname VARCHAR(50), +| preis | DECIMAL(6,2) | Geldbetrag, exakt auf zwei Nachkommastellen | 
-  birthdate DATE +| erschienen | DATE | Datum ohne Uhrzeit | 
-); +| ausgeliehen | BOOLEAN | Ja oder nein |
-</code> +
-Nach Ausführung dieses DDL-Befehls würde das Ergebnis ähnlich wie in der folgenden Abbildung dargestellt aussehen.  +
-{{:modul:m290:learningunits:lu05:theorie:m290_lu06b.abb2.png?600|}}+
 </WRAP> </WRAP>
  
-**Erklärung:** 
-  * //INT// → ganze Zahl (1..50 etc) 
-  * //VARCHAR(50)// → Zeichenkette variabler Länge (max. 50) 
-  * //DATE// → Datum in YYYY-MM-DD 
  
 +===== Häufige Fehler =====
  
-===== Tabellen löschen ===== +<WRAP center round tip 80%> 
- +  * **Preis als FLOAT** → Rundungsfehler. Nehmen Sie DECIMAL. 
-Mit dem Befehl **DROP TABLE** löschen Sie eine komplette Tabelle (inklusive aller Daten): +  * **Telefonnummer als INT** → führende Nullen verschwinden (aus 0791234567 wird 791234567). Telefonnummern sind Text, nicht Zahlen – man rechnet nie damit. 
-<WRAP box center 80% round>  +  * **Datum als VARCHAR** → man kann weder sortieren noch Zeiträume berechnen.
-<code sql> +
-DROP TABLE student; +
-</code> +
-</WRAP> +
- +
-<WRAP box center 80% round important>  +
-**Achtung:** Dieser Befehl kann **nicht rückgängig gemacht** werden und dieser Befehl löscht auch alle Daten aus der Tabelle!+
 </WRAP> </WRAP>
  
 +Merken Sie sich die Faustregel: **Rechnet man damit, ist es eine Zahl. Sortiert man danach zeitlich, ist es ein Datum. Alles andere ist Text.**
  
-===== Merksatz ===== 
-^ SQL-Befehl        ^ Bedeutung                                      ^ 
-| CREATE DATABASE   | Neue Datenbank erstellen                       | 
-| USE DATABASE   | Datenbank "aktiv" schalten| 
-| DROP DATABASE      | Datenbank löschen                             | 
-| CREATE TABLE      | Neue Tabelle in der aktiven Datenbank erstellen| 
-| DROP TABLE        | Tabelle aus der aktiven Datenbank löschen      | 
  
 +===== Hinweis =====
 +Jedes DBMS (MySQL, PostgreSQL, Oracle …) bietet leicht unterschiedliche Datentypen. In diesem Modul arbeiten wir mit **MySQL** und beschränken uns auf die hier vorgestellten Typen.
 +Eine detaillierte Übersicht über alle MySQL-Datentypen finden Sie auf der offiziellen Dokumentation: [[https://dev.mysql.com/doc/refman/9.7/en/data-types.html|MySQL Docs Datentypen]]
  
 ---- ----
-[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]]+{{tag>M290-LU05}} 
 +[[https://creativecommons.org/licenses/by-nc-sa/4.0/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] Guido Koch
  
  • de/modul/m290_guko/learningunits/lu05/theorie/a_ddl.1789325091.txt.gz
  • Zuletzt geändert: 2026/09/13 20:44
  • von gkoch