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

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 36: Zeile 36:
</source>
</source>


In SQL-99 (und in den meisten SQL-[[Datenbank-Management-System]]en) gibt es diese Funktion nicht mehr.<ref>{{Quelle|Gulutzan, P.; Pelzer, T. (1999): SQL-99 complete}}</ref> Als Identitätsfunktion kommt hier
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:
<code>SELECT * FROM</code> zum Einsatz:


Zeile 51: Zeile 52:
SELECT * FROM haendler
SELECT * FROM haendler
=  
=  
haendler /* kein SQL*/ = TABLE haendler /* SQL-92, aber nicht SQL-99 */
TABLE haendler /* SQL-92, aber nicht SQL-99 */
=
haendler /* kein SQL*/  
</source>
</source>


===Anmerkung 1===
'''Anmerkung 1'''<br/>
 
In PostgreSQL läuft – im Gegensatz zu SQLite – die erste der drei obigen Anfrage auf einen Fehler, da hier  
In PostgreSQL läuft die erste der drei obigen Anfrage auf einen Fehler, da hier  
[[Unterabfrage]]n stets benannt werden müssen.
[[Unterabfrage]]n stets benannt werden müssen.
In PostgreSQL muss man die erste Select-Anweisung daher folgenrdemaßen schreiben:
In PostgreSQL muss man die erste Select-Anweisung daher folgendermaßen schreiben:


<source lang="sql">
<source lang="sql">
SELECT * FROM (SELECT * FROM haendler) AS h
SELECT * FROM (SELECT * FROM haendler) AS dummy
</source>
</source>


===Anmerkung 2===
'''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 77: Zeile 79:


<source lang="sql">
<source lang="sql">
SELECT hnr, name, adresse FROM haendler
SELECT h_id, h_name, h_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 (vgl. di Tabelle <code>haendler</code> in [[Händler-Datenbank (SQL-Beispiel)|Händler-Datenbank]]
<code>haendler</code> hinzugefügt wird (vgl. die Tabelle <code>haendler</code> in
und [[Händler2-Datenbank (SQL-Beispiel)|Händler2-Datenbank]]). Das heißt, aufgrund einer Schema-Änderung  
[[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,
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.
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  
Darüber hinaus ist die Attribut-Reihenfolge bei <code>SELECT-*-</code>Anfragen nicht  
festgelegt. Auch diese könnte sich – zum Beispiel nach einem Upgrade der zugehörigen Datenbank
festgelegt. Auch diese kann sich plötzlich unerwartet ändern – zum Beispiel nach einer Modifikation der [[Domäne]] eines der [[Attribut]]e,
– plötzlich unerwartet ändern.
wie {{zB}} der Änderung der Anzahl der erlaubten Zeichen der Domäne des
Attributs <code>h_adresse</code> (<code>VARCHAR(50)</code> →  <code>VARCHAR(100)</code> {{oÄ}}).


==Quellen==
==Quellen==

Version vom 11. Mai 2018, 19:30 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen:

Korrektheit: 4
(großteils überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 4
(fast vollständig vorhanden)
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 also keine korrekte SQL-Anfrage:

haendler

Um den Inhalt einer Tabelle auszugeben, benötigt man also eine Identitätsfunktion. Diese gab es noch in SQL-92:[1]

TABLE haendler

Dieser Befehl wird beispielsweise von PostgreSQL unterstützt. In SQL-99 (und in den meisten SQL-Datenbank-Management-Systemen) gibt es diese Funktion allerdings nicht mehr.[2] 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)
=    
SELECT * FROM haendler
= 
TABLE haendler /* SQL-92, aber nicht SQL-99 */
= 
haendler /* kein SQL*/

Anmerkung 1
In PostgreSQL läuft – im Gegensatz zu SQLite – 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 folgendermaßen schreiben:

SELECT * FROM (SELECT * FROM haendler) AS dummy

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 h_id, h_name, h_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 (vgl. die Tabelle haendler in 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 SELECT-*-Anfragen nicht festgelegt. Auch diese kann sich plötzlich unerwartet ändern – zum Beispiel nach einer Modifikation der Domäne eines der Attribute, wie z. B. der Änderung der Anzahl der erlaubten Zeichen der Domäne des Attributs h_adresse (VARCHAR(50)VARCHAR(100) o. Ä.).

Quellen

  1. Date, Darwen (1993): Christopher J. Date und Hugh Darwen; A Guide to the SQL Standard – A user's guid to the standard relational language SQL; Auflage: 3; Verlag: Addison-Wesley; Adresse: Reading, Massachusetts, USA; 1993; Quellengüte: 5 (Buch), S. 126
  2. Gulutzan, Pelzer (1999): Peter Gulutzan und Trudy Pelzer; SQL-99 complete, Really – An Example-Based Reference Manual of the New Standard; Verlag: R&D Books; ISBN: 0-87930-568-1; 1999; Quellengüte: 5 (Buch)
  1. Kowarschick (MMDB-Skript): Wolfgang Kowarschick; Vorlesung Multimedia-Datenbanksysteme – Sommersemester 2018; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 4 (Skript)
  2. Kowarschick (MMDB): Wolfgang Kowarschick; Vorlesung „Multimedia-Datenbanksysteme“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2016; Quellengüte: 3 (Vorlesung), http://mmdb.hs-augsburg.de/beispiel/haendler/

Siehe auch