[lustiges DB-Bild]

 

 

 

 

 

 

 

 

 


1. Was ist eine Datenbank?

1.1 Beispiele für Datenbanken:

Tabelle1
Name Gehalt
Hans 1000
Ulrike 2000

 

 
Tabelle2
Name Strasse Telefonnummer
Hans Müller Milchstr. 44 (007) 111 222
Liese Schmitz Schmiedstr. 100 (007) 222 111

1.2 Definition:

Sammlung von Daten, die untereinander in einer logischen Beziehung stehen und von einem Datenbankverwaltungsprogramm (DBMS) verwaltet werden. 

 

 

 

 

 

 

 

 

 


2. Schnittstelle

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


3. Liste freier Datenbanken

http://linas.org/linux/db.html

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


4. MySQL

4.1 Lizenz

4.2 Woher

http://www.mysql.org/

4.3 Zugriffsrechte

Via Datenbank mysql:

Nach jedem Ändern der Zugriffsrechte mysqladmin reload ausführen.

4.4 Datentypen (nicht vollständig)

MySQL-Datentypen
Typ Beschreibung
tinyint -128 .... 127
smallint -32768 .... +32767
int -2147483648 .... +2147483647
float(n) n E {4;8}, Einfache und doppelte Genauigkeit
date YYYY-MM-DD Datumsformat
time HH-MM-SS Zeitformat
char(m) Zeichenkette mit fester Länge
varchar(m) variable Länge, max. m Zeichen
blob Binary Large Object, wird für Texte gebraucht, "TINY", "", "LONG"

 

 

 

 

 

 

 

 

 


5. PostgreSQL

5.1 Lizenz

Das Copyright liegt bei der Unversity of California. Man kann mit der Software anstellen, was man will.

5.2 Woher

http://www.postgresql.org/

5.3 Zugriffsrechte

5.4 Datentypen (nicht vollständig)

PostgreSQL-Datentypen
Typ Beschreibung
float4 6 Dezimalstellen
float8 15 Dezimalstellen
int2 -32767 .... +32768
int4 -2147483648 .... +2147483647
int8 +/- 18 Dezimalstellen
money 4 Byte, -21474836,48 .... +21474836,47
char ein Zeichen
text Variable Länge
varchar(n) 4+n Bytes
date Datum, Datumformate mit SET DATESTYLE=Value einstellbar
time Uhrzeit, Auflösung 1 Mikrosekunde
bool Kann den Wert 't' oder 'f' annehmen
Darüberhinaus Typen für Geometrien und Netzwerke, Zeitzonen, ...

 

 

 

 

 

 

 

 

 


6. SQL Teil 1

6.1 Erzeugen einer Datenbank

CREATE DATABASE testdb;

6.2 Erzeugen einer Tabelle

CREATE TABLE tabelle1 (name VARCHAR(100), gehalt INT2);

6.3 Verändern der Tabellendefinition

ALTER TABLE tabelle1 ADD nummer INT;
ALTER TABLE tabelle1 DROP nummer;

6.4 Eingabe der Daten in die Tabelle

INSERT INTO tabelle1 VALUES('hans',1000);
INSERT INTO tabelle1 VALUES('ulrike', 2000);

6.5 Abfragen der Daten

SELECT * FROM tabelle1;
SELECT name, SUM(gehalt) FROM tabelle1 GROUP BY name;
SELECT * FROM tabelle1 WHERE gehalt=1000;
SELECT name, 12*gehalt AS jahresgehalt FROM tabelle1;
SELECT * FROM tabelle1 ORDER BY name DESC;
SELECT * FROM tabelle1 ORDER BY name ASC;

6.6 Ändern von Daten

UPDATE tabelle1 SET gehalt=2000 WHERE name='hans';

6.7 Löschen der Daten

DELETE FROM tabelle1;
DELETE FROM tabelle1 WHERE gehalt=2000;

6.8 Löschen einer Datenbank

DROP DATABASE testdb; 

 

 

 

 

 

 

 

 

 


7. SQL Teil 2

7.1 Hinweise zum Erstellen von Tabellen

7.2 Indexes

Eine ordentlicher gestaltete Tabelle nach Vorlage von Tabelle2 sähe so aus:

CREATE TABLE tabelle2 (name varchar(100), strasse varchar(100), telefon varchar(100) NOT NULL);
CREATE UNIQUE INDEX telefon_idx ON tabelle2 (telefon);
INSERT INTO tabelle2 VALUES('hans müller', 'milchstr. 44', '(007) 111 222');
INSERT INTO tabelle2 VALUES('hans müller', 'milchstr. 44', '(007) 111 222');
(2. Zeile liefert Fehler, weil Telefonnummer schon vorkomt)
INSERT INTO tabelle2 VALUES('ulrike meier', 'milchstr. 33', '(008) 123 456');

Ein Index erlaubt es, Zeilen als eindeutig zu kennzeichnen. In diesem Beispiel dürfen keine zwei Tupel dasselbe Attribut telefon haben.

7.3 Arbeiten mit mehreren Tabellen

Folgende Tabellen legen wir uns an:

Tabelle3
Personalnummer (*) Gehalt
111 1000
222 2000
112 2000
Tabelle4
Vorname Personalnummer (*)
Hans 111
Liese 222
Uschi 112
(*) Primärindex

CREATE TABLE tabelle3(Personalnummer int2 NOT NULL, Gehalt int2);
CREATE UNIQUE INDEX p_idx ON tabelle3 (Personalnummer);

CREATE TABLE tabelle4(Vorname varchar(100), Personalnummer int2 NOT NULL);
CREATE UNIQUE INDEX p_idx ON tabelle4 (Personalnummer);

INSERT INTO tabelle3 VALUES(111, 1000);
INSERT INTO tabelle3 VALUES(222, 2000);
INSERT INTO tabelle3 VALUES(112, 1000);

INSERT INTO tabelle4 VALUES('Hans', 111);
INSERT INTO tabelle4 VALUES('Liese', 222);
INSERT INTO tabelle4 VALUES('Uschi', 112);

7.4 Filtern von Informationen aus zwei Tabellen

Welche Person(Vorname) erhält welches Gehalt
SELECT a.Vorname, b.Gehalt FROM tabelle4 AS a, tabelle3 AS b WHERE a.Personalnummer=b.Personalnummer;

 

 

 

 

 

 

 

 

 


8. Datenbankaufrufe aus eigenen Programmen heraus

8.1 MySQL und C

#include <mysql.h>
#include <stdio.h>

int main(void)
{
  MYSQL       *connection;          /* Verbindung zu Postgres-Server */
  MYSQL_RES   *result;              /* Ergebnis einer Abfrage */
  char        sql[1000];            /* Hält Abfrage fest */
  MYSQL_ROW   row;                  /* Ergebniszeile */
  int         anz;                  /* Anzahl der Tupel */
  int         i;                    /* für for-Schleife */

  
                                    /* Datenstruktur initialisieren */
  connection=mysql_init(NULL);
  
                                    /* Verbindung aufbauen und testen */
  if(! mysql_real_connect(connection, NULL, "dbuser", 
                          NULL, "test", 0,NULL,0))
  {
    fprintf(stderr, "Verbindung schlug fehl\n");
    mysql_close(connection);
    exit(1);  
  }
  
  sprintf(sql, "SELECT * FROM tabelle");
                                    /* SQL-Befehl ausführen */
  if((mysql_query(connection, sql) !=0))
  {
    fprintf(stderr, "Abfrage schlug fehl (%s): %s\n", sql, mysql_error(connection));
    mysql_close(connection);
    exit(1);  
  }
                                    /* Ergebnisse speichern */
  result=mysql_store_result(connection);

  anz=mysql_num_fields(result);
  while((row=mysql_fetch_row(result)))
  {
    for(i=0; i<anz; i++)  printf("%s ", row[i]);
    printf("\n");
  }  
                                    /* Ergebnis-Speicher wieder freigeben */
  mysql_free_result(result);
                                    /* Verbindung trennen */
  mysql_close(connection);

  return 0;
}

Übersetzen mit:

gcc -c -g -Wall -I/usr/include/mysql -o m.o m.c
gcc -o mysqltest m.o -L/usr/lib/mysql -lm -lmysqlclient  

 

 

 

8.2 Postgres und C

#include <libpq-fe.h>
#include <stdio.h>

int main(void)
{

  PGconn      *connection;          /* Verbindung zu Postgres-Server */
  PGresult    *res;                 /* Ergebnis einer Abfrage */
  char        sql[1000];            /* Hält Abfrage fest */
  int         anz;                  /* Anzahl der Tupel */
  int         i;                    /* für for-Schleife */
  
                                    /* Verbindung aufbauen */
  connection=PQsetdbLogin(NULL, NULL, NULL, NULL, "hotel", "dbuser", NULL);
                                    /* Testen auf Erfolg */
  if(PQstatus(connection)!=CONNECTION_OK)
  {
    fprintf(stderr, "Verbindung schlug fehl\n");
    PQfinish(connection);
    exit(1);
  }
  
  sprintf(sql, "SELECT * FROM belegung");
                                    /* Anfang der Transaktion */
  res=PQexec(connection, "BEGIN");
  if(PQresultStatus(res) != PGRES_COMMAND_OK)
  {
    fprintf(stderr, "Verbindung schlug fehl\n");
    PQclear(res);                    
    PQfinish(connection);
    exit(1);
  }
  PQclear(res);
  
  res=PQexec(connection, sql);      /* SQL-Befehl ausführen */
  if(PQresultStatus(res) != PGRES_TUPLES_OK)
  {
    fprintf(stderr, "Abfrage schlug fehl (%s)\n", sql);
    PQclear(res);
    PQfinish(connection);
    exit(1);
  }
  
  anz=PQntuples(res);                /* Anzahl der Tupel ermitteln */
  
  for(i=0; i< anz; i++)              /* Alle ausgeben */
  {
    printf("%s  ", PQgetvalue(res, i, 0));
    printf("%s\n", PQgetvalue(res, i, 1));
  }
  PQclear(res);
                                    /* Ende der Transaktion */
  res=PQexec(connection, "COMMIT");
  PQclear(res);

  PQfinish(connection);              /* Verbindung trennen */
  return 0;
}

Übersetzen mit:

gcc -c -g -Wall -I/usr/lib/pgsql/include -o pg.o pg.c
gcc -o pgtest pg.o -L/usr/local/postgres/lib -lcrypt -lpq    

 

 

 

 

 

 

 

 

 


ENDE