Skip to content
Snippets Groups Projects
Commit dc3c24a4 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Notizen und Beispiel 30.6.2021

parent 391e6516
Branches
No related tags found
No related merge requests found
SQL, 30.06.2021, 10:27:54
=========================
Literatur: https://de.wikibooks.org/wiki/Einführung_in_SQL
:) Grundlagen zu Abfragen
:) Joins
.-----.-----. inner join: nur X
/ / \ \ left (outer) join: A und X
| A | X | B | right (outer) join: B und X
\ \ / / full (outer) join: A und B und X
`-----^-----'
Beispiel:
select images.name from images join techniques on images.technique_id = techniques.id
where techniques.japan_name like 'O %';
:) Gruppierungen
:) Maßnahmen gegen SQL Injection
:) Unterabfragen
Beispiel:
select * from images where technique_id in ( select id from techniques where group_id = 13 );
:) Bemerkung:
Meistens ist es nicht nötig, die abgefragten Daten
in der Anwendungssoftware nochmals zu filtern.
SQL-Abfragebefehle sind leistungsfähig genug,
immer direkt genau die gesuchten Datensätze zurückzuliefern.
Ausnahme: In seltenen Fällen braucht die Datenbanksoftware
für das Filtern länger als die Anwendungs-Software.
Beispiel: Inkrementelle Suche. Während der Eingabe des Suchbegriffs
ändert sich das Filterkriterium.
--> Nach jedem Tastendruck: Datenbankabfrage
--> Gegenmaßnahme: "Zu viele" Daten abfragen, in der Anwendung filtern
:) Backup der Datenbank zur Laufzeit
Dump-Software (z.B. pg_dump, mysqldump, ...):
Ausgabe einer Text-Datei mit SQL-Befehlen zur Standardausgabe
Rekonstruktion der Datenbank: durch Einfüttern
in psql (z.B. über Eingabe-Umleitung oder über eine Pipe)
Es ist möglich, pg_dump Löschbefehle voranstellen zu lassen,
um im laufenden Betrieb eine Datenbank neu einspielen zu können.
Auf ähnliche Weise kann man den Datenbestand auch mit Hilfe
von Shell-Skripts pflegen.
:) Views
CREATE VIEW <View-Name> [ ( <Spaltennamen> ) ] AS <Select-Ausdruck>;
Beispiel:
create view images_for_name as
select techniques.japan_name, images.name from images
join techniques on images.technique_id = techniques.id;
Vorteile:
- kürzere Befehle anstelle von joins
- Die Datenbank kann Zugriffe optimieren.
:) Änderungen der Datenbankstruktur
Aktuelle Struktur einer Tabelle ermitteln:
SELECT table_name, column_name, data_type FROM information_schema.columns WHERE table_name = 'groups';
Spalte hinzufügen:
alter table groups add column "english_name" varchar (35);
Spalte löschen:
alter table groups drop column english_name;
:) Constraints
Constraints helfen, die Datenbank konsistent zu halten.
Sie verhindern, Daten einzufügen, die die Konsistenz der Datenbank
gefährden würden.
--> Schadensbegrenzung bei fehlerhafter Anwendungs-Software
Beispiele:
- UNIQUE-Constraint: Schlüssel müssen eindeutig sein.
- Fremdschlüssel-Beziehungen
Daten in der einen Tabelle können nur eingefühgt werden, wenn der
referenzierte Fremdschlüssel in der anderen Tabelle existiert.
Dadurch, daß Constraints beim Einfügen überprüft werden müssen,
verlangsamt sich die Geschwindigkeit beim Einfügen.
:) Indizes
Die Datenbank kann bestimmte Spalten "indizieren"
(sortieren (O(log n)), Hash-Tabelle anlegen (O(1)), ...),
um die Geschwindigkeit bei Abfragen zu erhöhen.
https://www.postgresql.org/docs/9.1/sql-createindex.html:
PostgreSQL provides the index methods B-tree, hash, GiST, and GIN
Beispiel: select id from techniques where japan_name = 'O Goshi';
Die Datenbank hat die Spalte als Array oder Liste vorliegen.
- lineare Suche nach dem String --> O(n)
- Die Datenbank hat das Array vorher sortiert (z.B. als B-Baum). --> O(log n)
- Die Datenbank hat vorher eine Hash-Tabelle angelegt. --> O(1)
Durch das Sortieren/Hashen steigt der Aufwand beim Einfügen
in die Tabelle.
--> Durch Auswahl des Index-Algorithmus (gar nicht, B-Baum, Hash-Tabelle, ...)
kann ich eine Datenbank für schnelles Einfügen oder schnelles Abfragen optimieren.
Extremfall: Verzeichnisdienst (LDAP, Active Directory, DNS) statt Datenbank
Beispiel: Nutzung eines LDAP-Verzeichnisdienstes statt Datenbank
--> Einfügen extrem langsam.
- SQL-Programmierung
- Benutzung von Ausdrücken und Funktionen in select-Anweisungen
Thema für mogen?
- LaTeX
? Quantencomputer
cyberjudo=> select * from belts;
position | color | german_color_name
----------+--------+-------------------
-5 | yellow | gelb
-4 | orange | orange
-3 | green | grün
-2 | blue | blau
-1 | brown | braun
-1 | purple | lila
(6 Zeilen)
cyberjudo=> insert into belts (position, color, german_color_name) values (1, 'black', 'schwarz');
ERROR: insert or update on table "belts" violates foreign key constraint "belts_position_fkey"
DETAIL: Key (position)=(1) is not present in table "ranks".
cyberjudo=> select * from ranks;
position | japan_name | default_belt_color
----------+------------+--------------------
-5 | Go Kyu | yellow
-4 | Yon Kyu | orange
-3 | San Kyu | green
-2 | Ni Kyu | blue
-1 | Ik Kyu | brown
(5 Zeilen)
cyberjudo=> insert into ranks (position, japan_name, default_belt_color) values (1, 'Sho Dan', 'black');
ERROR: insert or update on table "ranks" violates foreign key constraint "ranks_position_fkey"
DETAIL: Key (position, default_belt_color)=(1, black) is not present in table "belts".
cyberjudo=>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment