Händler-Datenbank (SQL-Beispiel)/Identität: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Kowa (Diskussion | Beiträge)
Kowa (Diskussion | Beiträge)
Zeile 31: Zeile 31:


Um den Inhalt einer Tabelle auszugeben, benötigt man also eine Identitätsfunktion.
Um den Inhalt einer Tabelle auszugeben, benötigt man also eine Identitätsfunktion.
Diese gab es noch in SQL92:
Diese gab es noch in SQL-92:<ref>[[Date, C.; Darwen, H. (1993): A Guide to the SQL Standard]], S. 126</ref>


<source lang="sql">
<source lang="sql">
Zeile 52: Zeile 52:
SELECT * FROM haendler
SELECT * FROM haendler
=  
=  
haendler /* kein SQL*/ = TABLE haendler /* nur SQL92 */
haendler /* kein SQL*/ = TABLE haendler /* nur SQL-92 */
</source>
</source>



Version vom 8. Juli 2012, 13:05 Uhr

Dieser Artikel wird derzeit von einem Autor gründlich bearbeitet. Die Inhalte sind daher evtl. noch inkonsistent.

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:

Korrektheit: 3
(zu größeren Teilen überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 1
(fehlen großteils)
Quellenarten: 5
(ausgezeichnet)
Konformität: 5
(ausgezeichnet)

Die Identität

Die Identitätsfunktion der Relationalen Algebra ist eine triviale Funktion: Sie bildet eine Relation (Tabelle) auf sich selbst ab:

$ id: R \rightarrow R $
$ id(r) = r $

Diese Funtion ist idempotent:

$ id(id(r)) = id(r) = r $

In SQL ist es nicht möglich, auf den Inhalt einer benannten Tabelle zuzugreifen, indem man einfach den Namen der Tabelle angibt. Folgendes ist als kein korrektes SQL:

haendler

Um den Inhalt einer Tabelle auszugeben, benötigt man also eine Identitätsfunktion. Diese gab es noch in SQL-92:[1]

TABLE haendler

In SQL99 (und in PostgreSQL) gibt es diese Funktion nicht mehr. Als Identitätsfunktion kommt hier SELECT * FROM zum Einsatz:

SELECT * FROM haendler

Das zuvor formulierte Idempozenz-Gesetz gilt auch in SQL, wenn auch mit der zuvor genannten Einschränkung, dass es sich bei der direkten Angabe eines Tabellennamens um keinen korrekten SQL-Befehl handelt:

SELECT * FROM (SELECT * FROM haendler) -- Fehlermeldung in PostgreSQL
=    
SELECT * FROM haendler
= 
haendler /* kein SQL*/ = TABLE haendler /* nur SQL-92 */

Anmerkung 1

In PostgreSQL läuft die erste der drei obigen Anfrage auf einen Fehler, da hier Unterabfragen stets benannt werden müssen. In PostgreSQL muss man die erste Select-Anweisung daher folgenrdemaßen schreiben:

SELECT * FROM (SELECT * FROM haendler) AS h

Anmerkung 2

Die Selektion SELECT * FROM sollte man i. Allg. nur für Ad-hoc-Anfragen in Tools wie phpPgAdmin oder pgAdmin III verwenden. In Programmcode sollte man darauf verzichten und besser alle Attribute explizit aufführen. Das heißt, an Stelle von

SELECT * FROM haendler

sollte man

SELECT hnr, name, adresse FROM haendler

schreiben. Der Grund ist, dass die SELECT-*-Anfrage ihre Bedeutung ändert, wenn sich das Schema der Datenbank ändert, wenn also z.B. ein weiteres Attribut zur Tabelle haendler hinzugefügt wird. Das heißt, aufgrund einer Schema-Änderung könnte sich ungewollt das Verhalten eines Programms ändern. Zum Beispiel könnte eine Tabelle, die das Ergbnis einer Select-Anfrage ausgibt, plötzlich mehr Spalten als geplant enthalten. Darüber hinaus ist die Attribut-Reihenfolge bei SELECT-*-Anfragen nicht festgelegt. Auch diese könnte sich – zum Beispiel nach einem Upgrade der zugehörigen Datenbank – plötzlich unerwartet ändern.

Quellen

  1. Kowarschick (MMDB): Wolfgang Kowarschick; Vorlesung „Multimedia-Datenbanksysteme“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2016; Quellengüte: 3 (Vorlesung)