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)
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
{{In Bearbeitung}}
{{In Bearbeitung}}
{{Qualität
{{Qualität
|correctness        = 5
|correctness        = 0
|extent              = 4
|extent              = 4
|numberOfReferences  = 5
|numberOfReferences  = 5
Zeile 17: Zeile 17:
</div>
</div>


Es gilt folgendes triviales Gesetz:
Diese Funtion ist ''idempotent'':


<div class="formula">
<div class="formula">
Zeile 27: Zeile 27:
SQL:
SQL:
<source lang="sql">
<source lang="sql">
haendler
haendler  
</source>
</source>


Zeile 38: Zeile 38:


In SQL99 (und in PostgreSQL) gibt es diese Funktion nicht mehr. Als Identitätsfunktion kommt hier
In SQL99 (und in PostgreSQL) gibt es diese Funktion nicht mehr. Als Identitätsfunktion kommt hier
<code>SELECT * FROM</code> zum Einsatz.
<code>SELECT * FROM</code> zum Einsatz:
 
<source lang="sql">
SELECT * FROM haendler
</source>
 
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:
 
<source lang="sql">
SELECT * FROM (SELECT * FROM haendler)
=   
SELECT * FROM haendler
=
handler -- kein SQL
</source>
 
 


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


Die erste dieser beiden Lösungen ist, gerade im Web-Bereich, im Hinsicht auf Sicherheit
Die erste dieser beiden Lösungen ist, gerade im Web-Bereich, im Hinsicht auf Sicherheit

Version vom 5. Juli 2012, 09:00 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
= 
handler -- kein SQL


SELECT * FROM haendler;                 
SELECT hnr, name, adresse FROM haendler;


Die erste dieser beiden Lösungen ist, gerade im Web-Bereich, im Hinsicht auf Sicherheit und Performanz deutlich schlechter, als die zweite. Die gilt vor allem, wenn zu einerr Tabelle später weitere Attribute hinzugefügt werden, da sich dadurch die Semantic der SELECT-*-Anweisung verändert (Ausnahmen: EXISTS(SELECT * ...), COUNT(*)).

In SQL92 gab es eine Ideintitätsfunktion: TABLE. Die folgenden Befehle sind korrekte SQL92-Befehle (jedoch keine SQL99-Befehle), die jeweils die gesamte Tabelle als Ergebnis liefern..

TABLE haendler;
SELECT * FROM TABLE haendler;


/*

* Als Tabelle dürfen auch komplexe SQL-Ausdrücke verwendet werden.
* Allerdings entfernt SQL Duplikate nicht automatisch.
* 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; SELECT * FROM (SELECT typ FROM ware) AS ware_typ; /* Duplikate */

Quellen

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