Table of Contents

  1. Schema-Ausgabe (CLI)
  2. Primärschlüssel
  3. PK und FK
  4. Datenbank von der Sub-Shell öffnen
  5. sqlite3 Optionen-Liste
  6. SQLite Speicherung
  7. Ausgabe
  8. Tabelle in Datenbank laden
  9. Tabellenspalten hinzufügen
  10. Einträge in Zeilen aktualisieren
  11. Zeilen löschen
  12. CSV-Datei in SQLite importieren

Schema-Ausgabe (CLI)

Mit welchem Befehl kann man sich das Schema von foods.db im CLI (Command Line Interface) ausgeben (auf der System-Shell, also nicht auf der SQLite Sub-Shell).

sqlite3 foods.db .schema

Primärschlüssel

Wie lautet der Primärschlüssel der Tabelle foods_episodes? Geben Sie Ihre Antwort in runden Klammern ein (…).

Der Primärschlüssel der Verbindungstabelle foods.episodes ist das Paar (food_id, episode_id). So können Speisen aus foods den Episoden in episodes eindeutig zugeordnet werden.

PK und FK

Wofür braucht man Primärschlüssel (PK) und Fremdschlüssel (FK) nützlich, wenn Daten über mehrere Tabellen verteilt sind?

Um einen JOIN durchzuführen: PK und FK werden hierbei aufeinander abgebildet (bspw. mit ON).

Datenbank von der Sub-Shell öffnen

Wie können Sie eine Datenbank (z.b. foods.db) öffnen, ohne die SQLite Sub-Shell zu verlassen?

sqlite3 Optionen-Liste

Wie kann ich herausfinden, welche Optionen das Programm sqlite3 hat?

In SQLite: .help. Auf der System-Shell: sqlite3 --help

SQLite Speicherung

Sie haben sqlite3 ohne zusätzliche Optionen oder Dateien aufgerufen und eine Tabelle my_table erzeugt. Wenn Sie jetzt SQLite mit .quit verlassen, wo befindet sich my_table dann?

Antwort: in der in-memory Datenbank, die aber beim Verlassen von SQLite gelöscht wurde - d.h. die Tabelle ist verloren (befindet sich “nirgendwo”).

Ausgabe

Wie können Sie in SQLite herausfinden, wo Ihre Ergebnisse ausgegeben werden?

#+beginsrc sql sqlite> .show #+endsrc.output

Tabelle in Datenbank laden

Sie haben in SQLite eine Tabelle namens my_table erzeugt, aber vergessen, vorher eine Datenbank zum permanenten Speichern zu öffnen. Wie bekommen Sie die Tabelle jetzt in eine Datenbank my_dbank.db, so dass Sie beim nächsten Aufruf von SQLite direkt laden können, OHNE dass Sie die SQLite sub-shell verlassen müssen?

sqlite> CREATE TABLE my_table (id INTEGER);
sqlite> .schema my_table
CREATE TABLE my_table (id INTEGER);
sqlite> .output my_table.sql
sqlite> .dump my_table
sqlite> .output stdout
sqlite> .shell sqlite3 my_dbank.db < my_table.sql
sqlite> .open my_dbank.db
sqlite> .tables
my_table
sqlite> .schema my_table
CREATE TABLE my_table (id INTEGER);

Tabellenspalten hinzufügen

Sie wollen zur Tabelle my_table eine Spalte namens Name hinzufügen, die Namen enthalten soll. Wie lautet der entsprechende (DDL) SQLite-Befehl, um das zu tun?

sqlite> ALTER TABLE my_table ADD COLUMN Name TEXT;
sqlite> .schema
CREATE TABLE my_table (id INTEGER, Name TEXT);

Einträge in Zeilen aktualisieren

Sie haben eine Beispieltabelle erzeugt, die aussieht wie im Bild gezeigt: weil Sie vergessen haben, die Spalte id als Primary Key zu kennzeichnen, enthält diese Spalte jetzt nur NULL Werte. Frage: mit welchen (DML) Befehlen können Sie die Spalteneinträge für alle drei Zeilen aktualisieren?

sqlite> UPDATE my_table SET id=1 WHERE Name='Mueller';
sqlite> UPDATE my_table SET id=2 WHERE Name='Meier';
sqlite> UPDATE my_table SET id=3 WHERE Name='Schmidt';
sqlite> SELECT * FROM my_table;
id          Name      
----------  ----------
1           Mueller   
2           Meier     
3           Schmidt   

Zeilen löschen

Sie haben eine Beispieltabelle my_tbl, die aussieht, wie im Bild gezeigt. Wie können Sie die letzten beiden Zeilen mit einem Befehl löschen?

sqlite> DELETE FROM my_table WHERE id >=2;
sqlite>     SELECT * FROM my_table;
id          Name      
----------  ----------
1           Mueller   

CSV-Datei in SQLite importieren

Sie haben eine CSV-Tabelle test.csv erstellt, die so aussieht:

1,Joe 2,Jim 3,Jane

Sie können die Tabelle mit .import in eine neue Tabelle csv_test importieren:

sqlite> .import test.csv csv_test

Das Ergebnis sieht aber so aus:

sqlite> SELECT * FROM csv_test;
1,Joe     
----------
2,Jim     
3,Jane    

Oder, wenn Sie .header OFF" setzen:

sqlite> .header off
sqlite> SELECT * FROM csv_test;
2,Jim
3,Janep

D.h. die erste Zeile der CSV-Datei wurde irgendwie geschluckt. Wie kann man das Problem lösen?

Tip: schlagen Sie den Befehl .import nach.

Antwort: eine entsprechend formatierte Tabelle muss vorliegen, denn .import füllt die Werte nur ein, und erzeugt kein Tabellen-Schema. Damit die Spalten erkannt werden, muss außerdem der .separator auf , gestellt werden:

sqlite> CREATE TABLE csv_test_1 (id INTEGER, name TEXT);
sqlite> .separator ,
sqlite> .import test.csv csv_test_1
sqlite> SELECT * FROM csv_test_1;
1           Joe       
2           Jim       
3           Jane