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

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Zeile 44: Zeile 44:
</source>
</source>


Das zuvor formulierte Idempozenz-Gesetz gilt auch in SQL, wenn auch mit der eben genannte Einschränkung, dass
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:  
es sich bei der direkten Angabe eines Tabellennamens um keinen korrekten SQL-Befehl handelt:  


<source lang="sql">
<source lang="sql">
SELECT * FROM (SELECT * FROM haendler)
SELECT * FROM (SELECT * FROM haendler) -- Fehlermeldung in PostgreSQL
=     
=     
SELECT * FROM haendler
SELECT * FROM haendler
=  
=  
haendler -- kein SQL
haendler /* kein SQL*/ = TABLE haendler /* nur SQL92 */
</source>
</source>


In PostgreSQL läuft diese Anfrage auf einen Fehler, da hier  
==Anmerkung 1==
[[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Unterabfrage|Unterabfragen]] stets beannt werden müssen.
 
In PostgreSQL muss man also folgenden Befehl schreiben.
In PostgreSQL läuft die erste der drei obigen Anfrage auf einen Fehler, da hier  
[[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Unterabfrage|Unterabfragen]] stets benannt werden müssen.
In PostgreSQL muss man die erste Select-Anweisung daher folgenrdemaßen schreiben:


<source lang="sql">
<source lang="sql">
Zeile 63: Zeile 65:
</source>
</source>


==Anmerkung==
==Anmerkung 2==
Die Selektion <code>SELECT * FROM</code> sollte man i. Allg. nur für Ad-hoc-Anfragen  
Die Selektion <code>SELECT * FROM</code> sollte man i. Allg. nur für Ad-hoc-Anfragen  
in Tools wie [[phpPgAdmin]] oder [[pgAdmin III]] verwenden. In Programmcode sollte
in Tools wie [[phpPgAdmin]] oder [[pgAdmin III]] verwenden. In Programmcode sollte
Zeile 73: Zeile 75:
</source>
</source>


sollte man besser
sollte man


<source lang="sql">                 
<source lang="sql">                 
SELECT hnr, name, adresse FROM haendler;
SELECT hnr, name, adresse FROM haendler
</source>
</source>


schreiben. Der Grund ist, dass die <code>SELECT-*-</code>Anfrage ihre Bedeutung ändert,
schreiben. Der Grund ist, dass die <code>SELECT-*-</code>Anfrage ihre Bedeutung ändert,
wenn sich das Schema der Datenbank ändert, wenn also z.B. ein weiteres Attribut zur Tabelle
wenn sich das Schema der Datenbank ändert, wenn also z.B. ein weiteres Attribut zur Tabelle
<code>haendler</code> hinzugefügt wird.
<code>haendler</code> 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.


=Quellen=
=Quellen=

Version vom 8. Juli 2012, 11:41 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 SQL92:

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 SQL92 */

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.

Quellen

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