|
|
| Zeile 1: |
Zeile 1: |
| {{In Bearbeitung}}
| | #REDIRECT [[Projekt]] |
| {{Qualität
| |
| |correctness = 4
| |
| |extent = 4
| |
| |numberOfReferences = 4
| |
| |qualityOfReferences = 5
| |
| |conformance = 5
| |
| }}
| |
| Die nachfolgenden Beispiele können beispielsweise mit [[SQLite]] oder [[PostgreSQL]] getestet werden.
| |
| Installieren Sie dazu die zugehörige [[Händler-Datenbank (SQL-Beispiel)|Händler-Datenbank]].
| |
|
| |
|
| == Die Projektionsfunktion==
| |
| [[File:Relational Algebra Single Table Projection Extended.svg|mini|200px|Eine Projektionsfunktion berechnet für jedes Tupel einer Tabelle ein neues Tupel; Duplikatzeilen werden üblicherweise entfernt]]
| |
|
| |
| Eine Projektionsfunktion einer [[Relationale Algebra#Projektion|Relationalen Algebra]]
| |
| <div class="formula">
| |
| <math>π_{f_1 \,\text{as}\, b_1, \ldots, f_k \,\text{as}\, b_k}: R \rightarrow R</math><br />
| |
| </div>
| |
| berechnet für jedes Tupel einer Relation ein neues Tupel: $f_i$ ist dabei eine Funktion, die für jedes Tupel
| |
| $(v_1:a_1, \ldots, v_n:a_n) \in r$ jeweils einen Wert $f_i((v_1:a_1, \ldots, v_n:a_n))$ berechnet,
| |
| der in das Ergebnistupel unter dem Namen $b_i$ eingefügt wird.
| |
|
| |
| Man beachte: Dabei entstehende Duplikate müssen ebenfalls entfernt werden (sofern die relationale Algebra nicht
| |
| multimengenbasiert, sondern mengenbasiert ist).
| |
|
| |
| == Beispiele bezüglich der [[Händler-Datenbank (SQL-Beispiel)|Händler-Datenbank]]==
| |
| (Diese Beispiele wurden mit [[PostgreSQL]] und [[SQLite]] getestet.)
| |
|
| |
| Selektion aller Attribute der Tabelle <code>haendler</code> ([[Händler-Datenbank (SQL-Beispiel)/Identität|Identität]]):
| |
| <source lang="sql">
| |
| SELECT h_id, h_name, h_adresse
| |
| FROM haendler
| |
| </source>
| |
| {| class="datatable-sql"
| |
| ! h_id !! h_name !! h_adresse
| |
| |-
| |
| | 1 || Maier || Königsbrunn
| |
| |-
| |
| | 2 || Müller || Königsbrunn
| |
| |-
| |
| | 3 || Maier || Augsburg
| |
| |-
| |
| | 4 || Huber || NULL
| |
| |-
| |
| | 5 || Schmidt || Hamburg
| |
| |}
| |
| <br/>
| |
| Änderung der Position der Attribute:
| |
| <source lang="sql">
| |
| SELECT h_name, h_adresse, h_id
| |
| FROM haendler
| |
| </source>
| |
| {| class="datatable-sql"
| |
| ! h_name !! h_adresse !! h_id
| |
| |-
| |
| | Maier || Königsbrunn || 1
| |
| |-
| |
| | Müller || Königsbrunn || 2
| |
| |-
| |
| | Maier || Augsburg || 3
| |
| |-
| |
| | Huber || NULL || 4
| |
| |-
| |
| | Schmidt || Hamburg || 5
| |
| |}
| |
| <br/>
| |
| Entfernen einer Spalte:
| |
| <source lang="sql">
| |
| SELECT h_name, h_adresse
| |
| FROM haendler
| |
| </source>
| |
| {| class="datatable-sql"
| |
| ! h_name !! h_adresse
| |
| |-
| |
| | Maier || Königsbrunn
| |
| |-
| |
| | Müller || Königsbrunn
| |
| |-
| |
| | Maier || Augsburg
| |
| |-
| |
| | Huber || NULL
| |
| |-
| |
| | Schmidt || Hamburg
| |
| |}
| |
| Das Ergebnis enthält keine Duplikate, da die Attribute <code>(h_name, h_adresse)</code>
| |
| gemäß Datenmodell einen [[Schlüsselkandidat]] (''key candidate, ''unique key'') bilden.
| |
| <br/>
| |
| Entfernen zweier Spalten:
| |
| <source lang="sql">
| |
| SELECT h_name
| |
| FROM haendler
| |
| </source>
| |
| oder auch
| |
| <source lang="sql">
| |
| SELECT ALL h_name
| |
| FROM haendler
| |
| </source>
| |
| {| class="datatable-sql"
| |
| ! h_name
| |
| |-
| |
| | Maier
| |
| |-
| |
| | Müller
| |
| |-
| |
| | Maier
| |
| |-
| |
| | Huber
| |
| |-
| |
| | Schmidt
| |
| |}
| |
| Das Ergebnis enthält den namen Maier doppelt, da es zwei Händler mit dem gleichen Namen gibt.
| |
| <br/>
| |
| Mit Hilfe des <code>DISTINCT</code>-Operators können Duplikate entfernt werden:
| |
| <source lang="sql">
| |
| SELECT DISTINCT h_name
| |
| FROM haendler
| |
| </source>
| |
| {| class="datatable-sql"
| |
| ! h_name
| |
| |-
| |
| | Huber
| |
| |-
| |
| | Maier
| |
| |-
| |
| | Müller
| |
| |-
| |
| | Schmidt
| |
| |}
| |
| Beachten Sie bitte, dass sich die Reihenfolge geändert hat. SQL garantiert keine bestimmte Reihenfolge der Daten. Diese
| |
| kann sich auch jederzeit ändern ({{zB}} nach einer einfachen [[Schemaevolution]] , bei der beispielsweise <code>VARCHAR (30)</code>
| |
| durch <code>VARCHAR (50)</code> ersetzt wurde. Sollten die Daten in einer bestimmte Reihenfolge benötigt werden, müssen sie '''immer''' sortiert werden:
| |
| <source lang="sql">
| |
| SELECT DISTINCT h_name
| |
| FROM haendler
| |
| ORDER BY h_name DESC
| |
| </source>
| |
| {| class="datatable-sql"
| |
| ! h_name
| |
| |-
| |
| | Schmidt
| |
| |-
| |
| | Müller
| |
| |-
| |
| | Maier
| |
| |-
| |
| | Huber
| |
| |}
| |
|
| |
| ==Quellen==
| |
| <references/>
| |
| <ol start="1">
| |
| <li>{{Quelle|Kowarschick, W. (MMDB-Skript): Skriptum zur Vorlesung Multimedia-Datenbanksysteme}}</li>
| |
| <li>{{Quelle|Kowarschick, W.: Multimedia-Datenbanksysteme}}, https://kowa.hs-augsburg.de/mmdb/mmdb-beispiele/haendler-datenbank/</li>
| |
| </ol>
| |
| [[Kategorie:PostgreSQL-Beispiel]]
| |
| [[Kategorie:Praktikum:MMDB]]
| |
|
| |
| ==Siehe auch==
| |
| * [[Händler-Datenbank (SQL-Beispiel)]]
| |
| * [[Händler-Datenbank (SQL-Beispiel)/Identität]]
| |
| * [[Händler2-Datenbank (SQL-Beispiel)]]
| |