Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| 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] – gkoch | de: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 | + | * Ich kenne die wichtigsten MySQL-Datentypen |
| - | * 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 // | ||
| - | {{url> | + | < |
| - | + | ||
| - | ===== Datenbanken erstellen und löschen ===== | + | |
| - | + | ||
| - | Mit einer **Datenbank** schaffen Sie einen „Ordner“, | + | |
| - | 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 | + | |
| - | **Datenbank erstellen: | + | |
| <code sql> | <code sql> | ||
| - | CREATE DATABASE mydb_perfect; | + | SELECT Series_Title, |
| + | FROM imdb_top_1000 | ||
| + | ORDER BY Meta_score DESC; | ||
| </ | </ | ||
| - | //Bisher haben wir das in WebStorm per Rechtsklick auf die Verbindung → **New → Schema** gemacht (siehe Screenshot).// | ||
| - | {{de: | ||
| </ | </ | ||
| - | **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 | + | |
| - | Beispiel: Auf demselben MySQL-Server laufen z. B. die Datenbanken | + | |
| - | 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 | + | * **falsche Eingaben abgewiesen** werden |
| - | <code sql> | + | |
| - | USE mydb_perfect; | + | |
| - | </ | + | |
| - | In WebStorm haben wir bisher die Datenbank über das **Drop-Down-Feld < | + | |
| - | Der Befehl //USE// macht dasselbe – nur in SQL-Code-Form. | + | |
| - | {{de: | + | |
| - | </ | + | |
| - | 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 ==== | ||
| + | {{: | ||
| + | <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, | ||
| + | | **FLOAT** / **DOUBLE** | Kommazahlen mit **ungefährer** Genauigkeit | Messwerte, Sensordaten – bei uns selten | | ||
| + | </ | ||
| - | < | + | <WRAP center |
| - | **Datenbank löschen:** | + | **Geldbeträge immer DECIMAL, nie FLOAT.**\\ |
| - | <code sql> | + | FLOAT speichert Zahlen nur näherungsweise. Bei Preisen führt das zu Rundungsfehlern, |
| - | DROP DATABASE mydb_perfect; | + | |
| - | </ | + | |
| </ | </ | ||
| - | < | + | ==== Text ==== |
| - | **Achtung:** //DROP DATABASE// löscht die **gesamte** Datenbank inkl. **aller** Tabellen und Daten. In produktiven Systemen nur nach Backup verwenden. | + | {{: |
| + | |||
| + | <WRAP center | ||
| + | ^ 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, | ||
| </ | </ | ||
| + | Faustregel: **VARCHAR ist die Standardwahl.** CHAR nur, wenn die Länge wirklich immer gleich ist. TEXT nur für lange Fliesstexte. | ||
| + | ==== Datum und Zeit ==== | ||
| + | {{: | ||
| + | <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 | | ||
| + | </ | ||
| + | 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? | + | {{: |
| - | 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 box center | + | ^ Typ ^ Wofür ^ Werte ^ |
| - | <code sql> | + | | **BOOLEAN** | Genau zwei Zustände | true/false bzw. 1/0 | |
| - | CREATE TABLE tabellenname ( | + | |
| - | spaltenname1 DATENTYP, | + | |
| - | spaltenname2 DATENTYP, | + | |
| - | ... | + | |
| - | ); | + | |
| - | </ | + | |
| - | //**Wichtig**: nach der letzten Spalte wird __kein Kommma__ mehr geschrieben. Die drei Punkte (...) hier im Beispiel stehen für weitere Spalten.// | + | |
| </ | </ | ||
| + | Beispiel: // | ||
| - | **Wichtige Namensregeln: | ||
| - | * Keine Leerzeichen, | ||
| - | * Nur Kleinbuchstaben | ||
| - | * Tabellennamen müssen eindeutig sein | ||
| + | ===== Beispiel Buch ===== | ||
| - | ===== Beispiel: Tabelle Student ===== | + | {{:de: |
| - | Wir wollen eine Tabelle **student** (Lernende: | + | <WRAP center |
| - | < | + | ^ Spalte ^ Datentyp ^ Warum? ^ |
| - | <code sql> | + | | buch_id | INT | Fortlaufende ganze Zahl | |
| - | CREATE TABLE student ( | + | | titel | VARCHAR(100) | Titel sind unterschiedlich lang | |
| - | stundent_id | + | | isbn | CHAR(13) | Eine ISBN hat immer genau 13 Stellen | |
| - | | + | | seiten | INT | Ganze Zahl, keine halben Seiten | |
| - | | + | | preis | DECIMAL(6,2) | Geldbetrag, exakt auf zwei Nachkommastellen | |
| - | | + | | erschienen | DATE | Datum ohne Uhrzeit | |
| - | ); | + | | ausgeliehen | BOOLEAN | Ja oder nein | |
| - | </ | + | |
| - | Nach Ausführung dieses DDL-Befehls würde das Ergebnis ähnlich wie in der folgenden Abbildung dargestellt aussehen. | + | |
| - | {{: | + | |
| </ | </ | ||
| - | **Erklärung: | ||
| - | * //INT// → ganze Zahl (1..50 etc) | ||
| - | * // | ||
| - | * //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): | + | |
| - | < | + | * **Datum als VARCHAR** → man kann weder sortieren noch Zeiträume berechnen. |
| - | <code sql> | + | |
| - | DROP TABLE student; | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | <WRAP box center | + | |
| - | **Achtung:** Dieser Befehl kann **nicht | + | |
| </ | </ | ||
| + | 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 | ||
| - | | CREATE DATABASE | ||
| - | | USE DATABASE | ||
| - | | DROP DATABASE | ||
| - | | 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:// | + | {{tag> |
| + | [[https:// | ||