Händler-Datenbank (SQL-Beispiel)/Identität: Unterschied zwischen den Versionen
Kowa (Diskussion | Beiträge) |
Kowa (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
{{In Bearbeitung}} | {{In Bearbeitung}} | ||
{{Qualität | {{Qualität | ||
|correctness = | |correctness = 0 | ||
|extent = 4 | |extent = 4 | ||
|numberOfReferences = 5 | |numberOfReferences = 5 | ||
| Zeile 17: | Zeile 17: | ||
</div> | </div> | ||
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
- Kowarschick (MMDB): Wolfgang Kowarschick; Vorlesung „Multimedia-Datenbanksysteme“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2016; Quellengüte: 3 (Vorlesung)
