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

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Kowa (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Kowa (Diskussion | Beiträge)
Zeile 52: Zeile 52:
SELECT * FROM haendler
SELECT * FROM haendler
=  
=  
handler -- kein SQL
haendler -- kein SQL
</source>
</source>


 
In PostgreSQL läuft diese Anfrage auf einen Fehler, da hier
[[Händler-Datenbank (SQL-Beispiel, PostgreSQL)/Unterabfrage|Unterabfragen]] stets beannt werden müssen.
In PostgreSQL muss man also folgenden Befehl schreiben.


<source lang="sql">
<source lang="sql">
SELECT * FROM haendler;               
SELECT * FROM (SELECT * FROM haendler) AS h
SELECT hnr, name, adresse FROM haendler;
</source>
</source>


 
==Anmerkung==
Die erste dieser beiden Lösungen ist, gerade im Web-Bereich, im Hinsicht auf Sicherheit
Die Selektion <code>SELECT * FROM</code> sollte man i. Allg. nur für Ad-hoc-Anfragen
und Performanz deutlich schlechter, als die zweite. Die gilt vor
in Tools wie [[phpPgAdmin]] oder [[pgAdmin III]] verwenden. In Programmcode sollte
allem, wenn zu einerr Tabelle später weitere Attribute hinzugefügt werden,
man darauf verzichten und besser alle Attribute explizit aufführen. Das heißt,
da sich dadurch die Semantic der <code>SELECT</code>-<code>*</code>-Anweisung verändert
an Stelle von
(Ausnahmen: <code>EXISTS(SELECT * ...)</code>, <code>COUNT(*)</code>).
 
In SQL92 gab es eine Ideintitätsfunktion: <code>TABLE</code>.
Die folgenden Befehle sind korrekte SQL92-Befehle (jedoch keine SQL99-Befehle),
die jeweils die gesamte Tabelle als Ergebnis liefern..


<source lang="sql">
<source lang="sql">
TABLE haendler;
SELECT * FROM haendler
SELECT * FROM TABLE haendler;
</source>
</source>


sollte man besser


/*
<source lang="sql">               
* Als Tabelle dürfen auch komplexe SQL-Ausdrücke verwendet werden.
SELECT hnr, name, adresse FROM haendler;
* Allerdings entfernt SQL Duplikate nicht automatisch.
</source>
* Um dies zu erzwingen, muss "SELECT DISTINCT" verwendet werden:
*
* SELECT DISTINCT * FROM <komplexer Ausdruck>;
*/
 
  /* Standard-SQL, aber PostgreSQL-Fehler */
-- SELECT DISTINCT * FROM (SELECT typ FROM ware);


SELECT DISTINCT * FROM (SELECT typ FROM ware) AS ware_typ;
schreiben. Der Grund ist, dass die <code>SELECT-*-</code>Anfrage  ihre Bedeutung ändert,
SELECT          * FROM (SELECT typ FROM ware) AS ware_typ; /* Duplikate */
wenn sich das Schema der Datenbank ändert, wenn also z.B. ein weiteres Attribut zur Tabelle
<code>haendler</code> hinzugefügt wird.


=Quellen=
=Quellen=

Version vom 6. Juli 2012, 12:21 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: 0
(nicht überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 5
(ausgezeichnet)

Die Identität

Die Identitätsfunktion der Realtionalen 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. Folgends 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 eben genannte Einschränkung, dass es sich bei der direkten Angabe eines Tabellennamens um keinen korrekten SQL-Befehl handelt:

SELECT * FROM (SELECT * FROM haendler)
=    
SELECT * FROM haendler
= 
haendler -- kein SQL

In PostgreSQL läuft diese Anfrage auf einen Fehler, da hier Unterabfragen stets beannt werden müssen. In PostgreSQL muss man also folgenden Befehl schreiben.

SELECT * FROM (SELECT * FROM haendler) AS h

Anmerkung

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 besser

                 
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.

Quellen

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