Die Identitätsfunktion der [[Relationale Algebra|Relationalen Algebra]] ist eine triviale Funktion:
Die Projektion dient dazu, bestimmte Spalten aus einer beliebigen ({{dh}} gespeicherten oder berechneten Tabelle) zu selektieren.
Sie bildet eine Relation (Tabelle) auf sich selbst ab:
Wenn $r(a_1, \ldots, a_n)$ eine Relation ist und $\{c_1, \ldots, c_k\}$ eine Teilmenge der Attribute $\{a_1, \ldots, a_n\}$,
dann ist $π_{c_1, \ldots, c_k}(r)$ diejenige Tabelle, die aus $r$ entsteht, wenn man alle übrigen Spalten aus $r$
entfernt. Man beachte: Dabei entstehende Duplikate müssen ebenfalls entfernt werden (sofern die realtionale Algebra nicht
multimengenbasiert, sondern mengenbasiert ist).
<div class="formula">
<div class="formula">
<math>id: R \rightarrow R</math><br />
<math>π_{c_1, \ldots, c_k}: R \rightarrow R</math><br />
<math>id(r) = r</math>
</div>
</div>
Diese Funtion ist ''idempotent'':
<div class="formula">
<math>id(id(r)) = id(r) = r</math>
</div>
In SQL ist es nicht möglich, auf den Inhalt einer benannten Tabelle zuzugreifen,
indem man einfach den Namen der Tabelle angibt. Folgendes ist also keine korrekte
SQL-Anfrage:
<source lang="sql">
haendler
</source>
Um den Inhalt einer Tabelle auszugeben, benötigt man also eine Identitätsfunktion.
Diese gab es noch in SQL-92:<ref>{{Quelle|Date, Darwen (1993)}}, S. 126</ref>
<source lang="sql">
TABLE haendler
</source>
Dieser Befehl wird beispielsweise von [[PostgreSQL]] unterstützt.
In SQL-99 (und in den meisten SQL-[[Datenbank-Management-System]]en) gibt es diese Funktion allerdings nicht mehr.<ref>{{Quelle|Gulutzan, P.; Pelzer, T. (1999): SQL-99 complete}}</ref> Als Identitätsfunktion kommt hier
<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 zuvor genannten 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
=
TABLE haendler /* SQL-92, aber nicht SQL-99 */
=
haendler /* kein SQL*/
</source>
'''Anmerkung 1'''<br/>
In PostgreSQL läuft – im Gegensatz zu SQLite – die erste der drei obigen Anfrage auf einen Fehler, da hier
[[Unterabfrage]]n stets benannt werden müssen.
In PostgreSQL muss man die erste Select-Anweisung daher folgendermaßen schreiben:
<source lang="sql">
SELECT * FROM (SELECT * FROM haendler) AS dummy
</source>
'''Anmerkung 2'''<br/>
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
man darauf verzichten und besser alle Attribute explizit aufführen. Das heißt,
an Stelle von
<source lang="sql">
SELECT * FROM haendler
</source>
sollte man
<source lang="sql">
SELECT h_id, h_name, h_adresse FROM haendler
</source>
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
<code>haendler</code> hinzugefügt wird (vgl. die Tabelle <code>haendler</code> in
[[Händler-Datenbank (SQL-Beispiel)|Händler-Datenbank]]). 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 <code>SELECT-*-</code>Anfragen nicht
festgelegt. Auch diese kann sich plötzlich unerwartet ändern – zum Beispiel nach einer Modifikation der [[Domäne]] eines der [[Attribut]]e,
wie {{zB}} der Änderung der Anzahl der erlaubten Zeichen der Domäne des
Die Projektion dient dazu, bestimmte Spalten aus einer beliebigen (d. h. gespeicherten oder berechneten Tabelle) zu selektieren.
Wenn $r(a_1, \ldots, a_n)$ eine Relation ist und $\{c_1, \ldots, c_k\}$ eine Teilmenge der Attribute $\{a_1, \ldots, a_n\}$,
dann ist $π_{c_1, \ldots, c_k}(r)$ diejenige Tabelle, die aus $r$ entsteht, wenn man alle übrigen Spalten aus $r$
entfernt. Man beachte: Dabei entstehende Duplikate müssen ebenfalls entfernt werden (sofern die realtionale Algebra nicht
multimengenbasiert, sondern mengenbasiert ist).