| Name | Gehalt |
|---|---|
| Hans | 1000 |
| Ulrike | 2000 |
| Name | Strasse | Telefonnummer |
|---|---|---|
| Hans Müller | Milchstr. 44 | (007) 111 222 |
| Liese Schmitz | Schmiedstr. 100 | (007) 222 111 |
Sammlung von Daten, die untereinander in einer logischen Beziehung stehen und von einem Datenbankverwaltungsprogramm (DBMS) verwaltet werden.
http://linas.org/linux/db.html
Via Datenbank mysql:
Nach jedem Ändern der Zugriffsrechte mysqladmin reload ausführen.
| 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" |
Das Copyright liegt bei der Unversity of California. Man kann mit der Software anstellen, was man will.
| 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 |
CREATE DATABASE testdb;
CREATE TABLE tabelle1 (name VARCHAR(100), gehalt INT2);
ALTER TABLE tabelle1 ADD nummer INT;
ALTER TABLE tabelle1 DROP nummer;
INSERT INTO tabelle1 VALUES('hans',1000);
INSERT INTO tabelle1 VALUES('ulrike', 2000);
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;
UPDATE tabelle1 SET gehalt=2000 WHERE name='hans';
DELETE FROM tabelle1;
DELETE FROM tabelle1 WHERE gehalt=2000;
DROP DATABASE testdb;
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.
Folgende Tabellen legen wir uns an:
| Personalnummer (*) | Gehalt |
|---|---|
| 111 | 1000 |
| 222 | 2000 |
| 112 | 2000 |
| Vorname | Personalnummer (*) |
|---|---|
| Hans | 111 |
| Liese | 222 |
| Uschi | 112 |
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);
Welche Person(Vorname) erhält welches Gehalt
SELECT a.Vorname, b.Gehalt FROM tabelle4 AS a, tabelle3 AS b
WHERE a.Personalnummer=b.Personalnummer;
#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
#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