Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
A
ad
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Peter Gerwinski
ad
Commits
dc3c24a4
Commit
dc3c24a4
authored
Jun 30, 2021
by
Peter Gerwinski
Browse files
Options
Downloads
Patches
Plain Diff
Notizen und Beispiel 30.6.2021
parent
391e6516
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
20210630/ad-20210630.txt
+121
-0
121 additions, 0 deletions
20210630/ad-20210630.txt
20210630/fremdschluessel-beziehungen-1.txt
+28
-0
28 additions, 0 deletions
20210630/fremdschluessel-beziehungen-1.txt
with
149 additions
and
0 deletions
20210630/ad-20210630.txt
0 → 100644
+
121
−
0
View file @
dc3c24a4
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
This diff is collapsed.
Click to expand it.
20210630/fremdschluessel-beziehungen-1.txt
0 → 100644
+
28
−
0
View file @
dc3c24a4
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=>
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment