Seitenleiste

Community

SQL

Grundlagen

Datenbanksysteme

Client/Server

Eingebettet

Tabellen anlegen und löschen

Eine Tabelle beschreibt im Prinzip das gleiche wie eine Klasse in C++, bzw. eine Struktur in C: einen Datensatz. Dabei ist eine Tabelle eine Art Liste über eine Vielzahl von Datensätzen, genauso wie eine Klassendeklaration nur beschreibt, wie eine Objekt der jeweiligen Klasse auszusehen hat und es beliebig viele Instanzen dieses Typs geben kann. Prinzipiell kann man Tabellen genauso modellieren wie Klassen. Wie in C/C++ gibt es grundlegende Datentypen und Attribute.

Nehmen wir einen einfachen Datensatz:

struct Color
{
  unsigned char Red;
  unsigned char Green; 
  unsigned char Blue;  
};

Ein 8 Bit Integer heißt in „MySql“-Sprech TINYINT und das Attribut wird nachgestellt. Erstellen wir nun eine Tabelle für Farben. Für alle Fälle lösche ich zuvor die vorhandene Datenbank und lege eine neue Datenbank an. Dafür müssen wir uns wie zuvor beschrieben mit ausreichend Rechten bewaffnen (als root beim mysql-Client anmelden).

mysql> DROP DATABASE proggenorg;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE DATABASE proggenorg;
Query OK, 1 row affected (0.00 sec)

mysql> USE proggenorg;
Database changed
mysql> CREATE TABLE Color
    -> (
    -> Red TINYINT UNSIGNED,
    -> Green TINYINT UNSIGNED,
    -> Blue TINYINT UNSIGNED
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+----------------------+
| Tables_in_proggenorg |
+----------------------+
| color                |
+----------------------+
1 row in set (0.01 sec)

mysql>

Eine eher schlunzige Schreibweise würde genauso akzeptiert:

CREATE TABLE Color ( red tinyint UNSIGNED, green tinyint UNSIGNED, blue tinyint UNSIGNED );

Dies ist nicht schön, hat aber den Vorteil, dass man bei einer fehlerhaften mit den Cursor-Tasten den SQL-Befehl wieder erhält und korrigieren kann.

Wir können nun beliebige Tabellen beschreiben. Schauen wir uns an, wie ein Mitarbeiter beschrieben würde:

CREATE TABLE Staff
(
  Department        SMALLINT UNSIGNED,
  Salary            DECIMAL(7,2) NOT NULL,
  FamilyName        CHAR(100),
  GivenName         CHAR(100),
  Sex               CHAR(1),
  DateOfJoining     DATE
)

Wir sehen, dass SQL unterschiedliche Typen verwendet und auch Längenangaben, das sind die Werte in den Klammern. Ein TINYINT ist ein 8 Bit-Typ, ein SMALLINT ein 16-Bit-Typ, ein INTEGER entspricht 32 Bit. Ein CHAR speichert einen Buchstaben, CHAR(100) entsprechend 100 Buchstaben: der Vor- und der Familienname dürfen also maximal 100 Zeichen lang sein, der Rest würde abgeschnitten. DECIMAL ist eine Dezimalzahl die maximal 7 Stellen besitzt und davon sind 2 Nachkommastellen. Vor dem Komma sind also nur 5 Stellen! Das maximale Gehalt in der Firma liegt also bei 99999,99, mehr kann diese Datenbank nicht speichern. Je nach Gehaltsentwicklung könnte das ein Problemdarstellen, um das wir uns in der Zukunft wohl kümmern müssen. Ein DATE beschreibt ein Datum zwischen dem 1.1.1000 und dem 31.12.9999 und ist 3 Byte groß. Es gibt natürlich noch weitere Datentypen, aber diese sollen uns fürs erste hier reichen. Salary (Gehalt) hat das Attribut NOT NULL. Das bedeutet nicht, dass das Gehalt ungleich 0 sein muss, sondern sie muss einen gültigen Wert enthalten. Der Default-Wert ist ansonsten nämlich NULL: also ungültig.

Tabellendeklaration ansehen

Wenn man sich an erstmals eine vorhandene SQL-Datenbank setzt, stellt sich häufig erstmal die Frage, was in der Datenbank eigentlich wie gespeichert ist. Hierfür gibt es den Befehl DESCRIBE.

mysql> DESCRIBE Color;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| red   | tinyint(3) unsigned | YES  |     | NULL    |       |
| green | tinyint(3) unsigned | YES  |     | NULL    |       |
| blue  | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

mysql>

Das Feld „Null“ kennen wir bereits: alle Farbwerte dürfen hier uninitialisiert eingetragen werden und das ist auch ihr „Default“-Wert. Die Spalten „Key“ und „Extra“ werden wir uns im Verlauf des Tutorials noch genauer ansehen.

Tabellen löschen

Ähnlich wie die Datenbanken können auch einzelne Tabellen aus Datenbanken gelöscht werden. Nachdem wir uns mit USE versichert haben, dass wir nicht aus der falschen Datenbank löschen, können wir nun die Tabelle Color wieder mit DROP TABLE löschen:

mysql> use proggenorg;
Database changed
mysql> DROP TABLE Color;
Query OK, 0 rows affected (0.01 sec)

mysql>

Wichtig: Genauso wie DROP DATABASE stellt DROP TABLE keine Fragen. Bevor man einen solchen Befehl mit Enter bestätigt, sollte man immer nochmal den Befehl prüfen und kurz in sich gehen, ob man diese Daten wirklich vernichten möchte!

Ziel dieser Lektion

Wir können nun einfache Tabellen erstellen und wieder löschen, falls wir zum Beispiel beim Erstellen etwas falsch gemacht haben. Wir können uns mit den Aufbau von Tabellen ansehen. Wir haben gesehen, dass Tabellenbeschreibungen und Klassendefinitionen in der Programmierung recht eng miteinander verwandt sind. Und wir haben erkannt, dass SQL recht viel Prosa ist, wir also viel tippen müssen. In der nächsten Lektion werden wir daher lernen, wie wir dem Client vermitteln mit SQL-Dateien umzugehen, die wir komfortabel in einem Editor bearbeiten können.