Qualifizierte Namen in SQL (MySQL )
Vorbereitung
Zum Nachvollziehen der folgenden Beispiele kann das folgende Skript in einen MySQL -Klienten kopiert werden. Der Inhalt dieses Skripts kann aber ansonsten ignoriert werden. Bei Kopieren ist darauf zu achten, nur genau den Text von »DROP« bis zum letzten »;« zu kopieren und dann die Eingabetaste zu drücken.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE STADT
( STADT VARCHAR ( 255 ), BEZEICHNUNG VARCHAR ( 255 ));-- "Die Stadt mit der Kennzahl STADT hat die Bezeichnung BEZEICHNUNG."
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '1', 'Paris' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '2', 'Marseille' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '3', 'Lyon' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '4', 'Rom' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '5', 'Mailand' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '6', 'Neapel' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '7', 'Tokio' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '8', 'Yokohama' );
INSERT INTO STADT ( STADT, BEZEICHNUNG ) VALUES ( '9', 'Osaka' );
SELECT * FROM STADT;
Qualifizierte Namen
In dieser Lektion verwenden wir die folgende kleine Tabelle von Städten.
- Konsole (MySQL, E92, C99, C03)
SELECT * FROM STADT;
+-------+-------------+
| STADT | BEZEICHNUNG |
+-------+-------------+
| 1 | Paris |
| 2 | Marseille |
| 3 | Lyon |
| 4 | Rom |
| 5 | Mailand |
| 6 | Neapel |
| 7 | Tokio |
| 8 | Yokohama |
| 9 | Osaka |
+-------+-------------+- Aussprachehinweis
Lyon l i j ɔ̃
Wir zeigen hier auch noch einmal die Abfrage mit einem ausgeschriebenen Spaltennamen.
- Konsole
SELECT BEZEICHNUNG FROM STADT;
+-------------+
| BEZEICHNUNG |
+-------------+
| Paris |
| Marseille |
| Lyon |
| Rom |
| Mailand |
| Neapel |
| Tokio |
| Yokohama |
| Osaka |
+-------------+
Es ist in SQL grundsätzlich erlaubt, einem Spaltentitel den Namen einer der Tabellen voranzustellen, welche in der FROM-Klausel angegeben wurden, um sich auf die Spalte zu beziehen, welche aus der Tabelle mit diesem Namen übernommen wurde. Dabei ist der Name der Tabellen durch einen Punkt ».« vom folgenden Spaltentitel zu trennen.
In dem folgenden Beispiel wird »STADT.BEZEICHNUNG« an Stelle von »BEZEICHNUNG« verwendet, obwohl die ausführliche Schreibweise hier nicht nötig ist und keine Vorteil bietet. Zunächst soll nur gezeigt werden, daß die ausführlichere Schreibweise mit dem Tabellennamen möglich ist.
- Konsole (MySQL, E92, C99, C03)
SELECT STADT.BEZEICHNUNG FROM STADT;
+-------------+
| BEZEICHNUNG |
+-------------+
| Paris |
| Marseille |
| Lyon |
| Rom |
| Mailand |
| Neapel |
| Tokio |
| Yokohama |
| Osaka |
+-------------+
Indem der Tabellenname vor den Spaltennamen gestellt wird, kann genau angegeben werden, welche Spalte gemeint ist.
Wir werden später Fälle sehen, in denen dies nötig ist.
- Spaltenangabe
STADT.BEZEICHNUNG
- Spaltenangabe auf deutsch
- „Die Spalte ‚BEZEICHNUNG‘ aus der Tabelle ‚STADT‘ “
Der Qualifikationspunkt ».« als lexikalische Einheit
Der Punkt ».« ist in diesem Fall eine lexikalische Einheit für sich, wie die folgende Eingabe verdeutlicht.
- Konsole (MySQL, E92, C99, C03)
SELECT STADT
.
BEZEICHNUNG FROM STADT;+-------------+
| BEZEICHNUNG |
+-------------+
| Paris |
| Marseille |
| Lyon |
| Rom |
| Mailand |
| Neapel |
| Tokio |
| Yokohama |
| Osaka |
+-------------+
Bezeichner und qualifizierte Namen
Einen Namen ohne Punkt, wie beispielsweise »LAND« oder »BEZEICHNUNG« nennen wir auch einen Bezeichner (oder einfachen Namen ). ⃖
Einen Namen, der einen Punkt enthält, nennen wir auch einen qualifizierten Namen. ⃖
Falls einem Namen ein Bezeichner vorangestellt wird, der mit einem Punkt ».« getrennt ist, so sagen wir auch, daß der Name durch den Bezeichner qualifiziert werde. ⃖
Beispielsweise ist »STADT.BEZEICHNUNG« kein Bezeichner, aber ein qualifizierter Name, in welchem der Name »BEZEICHNUNG« durch den vorangestellten Bezeichner »LAND« qualifiziert ist.
Der Bezeichner am Ende eines qualifizierten Namens ist der eigentliche Name der Sache, für die der Name steht, während das Davorstehende nur dazu dient, den ganzen Namen eindeutig zu machen. Daher nennen wir den Bezeichner am Ende eines Namens auch den eigentlichen Namen. ⃖
Qualifikation mit dem Schema
Man kann einem Tabellennamen auch noch den Namen des Schemas, zu dem sie gehört, voranstellen, um auszudrücken, daß die Tabelle aus jenem Schema gemeint ist.
In dem folgenden Beispiel stellen wir dem Namen der Tabelle »STADT« noch den Namen des Schemas »S« voran (sowohl in der SELECT- als auch in der FROM-Klausel).
- Konsole
SELECT S.STADT.BEZEICHNUNG FROM S.STADT;
+-------------+
| BEZEICHNUNG |
+-------------+
| Paris |
| Marseille |
| Lyon |
| Rom |
| Mailand |
| Neapel |
| Tokio |
| Yokohama |
| Osaka |
+-------------+
Ein qualifizierter Name, der mit einem Schema-Namen beginnt, wird maximal qualifiziert oder vollständig qualifiziert genannt, da man ihm nichts mehr voranstellen kann. Solche Namen sind besonders robust, da ihre Bedeutung kaum von mit »USE« vorgenommenen Einstellungen abhängt. ⃖
(Einen qualifizierten Namen, der nicht maximal qualifiziert ist, könnte man auch als „einfach qualifizierten Namen“ bezeichnen.)
Qualifikationen finden sich auch in Fehlermeldungen (wie unten »s.example«). Daher muß man Qualifikationen allein schon deshalb verstehen, damit man solche Fehlermeldungen richtig interpretieren kann.
- Konsole
SELECT * FROM EXAMPLE;
ERROR 1146 (42S02): Table 's.example' doesn't exist
- Spaltenangabe
S.STADT.BEZEICHNUNG
- Spaltenangabe auf deutsch
- „Die Spalte ‚BEZEICHNUNG‘ aus der Tabelle ‚STADT‘, welche ihrerseits in dem Schema ‚S‘ enthalten ist. “
- Aussprachehinweis
- example ⌊ɩgˈzæ̣mpŁ̩⌋
Qualifikation eines Sternchens »*«
Ein Stern »*« in der Auswahlliste steht ja für „alle Spalten“. Auch dem Stern kann ein Tabellenname einer Tabelle vorangestellt werden, um zu sagen, daß alle Spalten aus jener Tabelle gemeint sind.
- Konsole
SELECT * FROM STADT;
+-------+-------------+
| STADT | BEZEICHNUNG |
+-------+-------------+
| 1 | Paris |
| 2 | Marseille |
| 3 | Lyon |
| 4 | Rom |
| 5 | Mailand |
| 6 | Neapel |
| 7 | Tokio |
| 8 | Yokohama |
| 9 | Osaka |
+-------+-------------+- Konsole
SELECT STADT.* FROM STADT;
+-------+-------------+
| STADT | BEZEICHNUNG |
+-------+-------------+
| 1 | Paris |
| 2 | Marseille |
| 3 | Lyon |
| 4 | Rom |
| 5 | Mailand |
| 6 | Neapel |
| 7 | Tokio |
| 8 | Yokohama |
| 9 | Osaka |
+-------+-------------+- Konsole
SELECT S.STADT.* FROM STADT;
+-------+-------------+
| STADT | BEZEICHNUNG |
+-------+-------------+
| 1 | Paris |
| 2 | Marseille |
| 3 | Lyon |
| 4 | Rom |
| 5 | Mailand |
| 6 | Neapel |
| 7 | Tokio |
| 8 | Yokohama |
| 9 | Osaka |
+-------+-------------+
Qualifikation in der WHERE-Klausel
Die oben gezeigten Qualifikationen sind nicht nur in einer SELECT-Klausel oder FROM-Klausel sondern auch in einer WHERE-Klausel möglich.
- Konsole
SELECT * FROM STADT WHERE STADT.STADT = '4';
+-------+-------------+
| STADT | BEZEICHNUNG |
+-------+-------------+
| 4 | Rom |
+-------+-------------+
Vor- und Nachteile vollständig qualifizierter Namen
Die Qualifikation mit einem Schema kann folgende Vorteile haben:
- Wenn man alle Tabellen immer mit ihrem Schema qualifiziert, so kann man auch mit der Datenbank arbeiten, ohne vorher ein Schema mit »USE« eingestellt zu haben. So kann das nicht-standardkonforme »USE« vermieden werden.
- Man kann Abfragen so schreiben, daß sie sich immer auf die gleiche (richtige) Tabelle beziehen, egal welches Schema mit »USE« eingestellt wurde. So können Abfragen robuster gestaltet werden.
- Da man sich so in Abfragen auch auf Tabellen aus verschiedenen Schemata gleichzeitig beziehen kann, kann man die Tabellen und Views einer Datenbank übersichlich auf verschiedenen Schemata aufteilen und trotzdem alle uneingeschränkt in Abfragen verwenden.
Die Qualifikation mit einem Schema kann folgende Nachteile haben:
- Wenn der Name eines Schemas geändert wird, dann müssen alle Abfragen, in denen noch der alte Name vorkommt, überarbeitet werden.
Abtrennung eines portablen Teils in Skripten
Die Qualifikation mit einem Schema erlaubt es auf die nicht-portable USE-Anweisung des MySQL-Klienten zu verzichten und Skripte zum Anlegen von Tabellen in reinem Standard-SQL zu schreiben, so daß sie mit möglichst vielen verschiedenen Datenbankprodukten zusammen verwendet werden können.
- Skript (SQL )
DROP SCHEMA S; CREATE SCHEMA S;
CREATE TABLE S.VORNAME ( VORNAME VARCHAR ( 255 ));
INSERT INTO S.VORNAME ( VORNAME ) VALUES ( 'Hans' );
INSERT INTO S.VORNAME ( VORNAME ) VALUES ( 'Lotte' );CREATE TABLE S.NACHNAME ( NACHNAME VARCHAR ( 255 ));
INSERT INTO S.NACHNAME ( NACHNAME ) VALUES ( 'Fischer' );
INSERT INTO S.NACHNAME ( NACHNAME ) VALUES ( 'Mayer' );
Nach solch einem Skript könnte dann noch »USE S« eingegeben werden, wenn man mit MySQL oder kompatiblen Systemen arbeitet.
Übungsfragen ⃖
Für die folgenden Übungsfragen wird vorausgesetzt, daß das am Anfang dieser Lektion stehende Skript ausgeführt und danach nichts verändert wurde.
? Namen ⃖
Welcher der folgenden Namen ist einfach (also ein Bezeichner), welcher qualifiziert und welcher vollständig qualifiziert?
(»S« ist ein Schema und »S.STADT« eine Tabelle.)
- »S.STADT.BEZEICHNUNG«
- »S«
- »S.STADT«
? Benanntes
Wofür stehen die folgenden Namen jeweils? (Spalte, Tabelle oder Schema?)
Hierbei soll angenommen werden, daß »BEZEICHNUNG« der Name einer Spalte der Tabelle »STADT« ist, die in dem Schema »S« enthalten ist und das Schema »S« mit »USE S« als aktuelles Schema eingestellt wurde.
- »S«
- »S.STADT«
- »S.STADT.BEZEICHNUNG«
- »STADT«
- »STADT.BEZEICHNUNG«
- »BEZEICHNUNG«
? Enthaltensein
Was kann man aus der Schreibweise »alpha.gamma« in SQL normalerweise entnehmen?
- »alpha« ist in »gamma« enthalten
- »gamma« ist in »alpha« enthalten
- keiner der obigen Antwortvorschläge trifft zu
? Ausdrücke
Welcher der folgenden Texte kann zwischen »SELECT« und »FROM« verwendet werden?
(»S« ist ein Schema und »S.STADT« eine Tabelle.)
o »S.STADT«
o »S.STADT.BEZEICHNUNG«
? Eigentliche Namen
Was ist der eigentliche Name der Tabelle »S.STADT«?
Was ist der eigentliche Name der Spalte »S.STADT.BEZEICHNUNG«?
Übungsaufgabe ⃖
/ Übungsaufgabe ⃖
Legen Sie ein neues Schema mit Hilfe des folgende Skripts an.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE NRW
( NRWSTADT VARCHAR ( 255 ), BEZEICHNUNG VARCHAR ( 255 ), EINWOHNER VARCHAR ( 255 ));INSERT INTO NRW ( NRWSTADT, BEZEICHNUNG, EINWOHNER ) VALUES ( '1', 'Dortmund', '586181' );
INSERT INTO NRW ( NRWSTADT, BEZEICHNUNG, EINWOHNER ) VALUES ( '2', 'Essen', '582624' );
INSERT INTO NRW ( NRWSTADT, BEZEICHNUNG, EINWOHNER ) VALUES ( '3', 'Duisburg', '491231' );SELECT * FROM NRW;
Geben Sie dann alle Zeilen der Tabelle aus, wobei die Spalten in der folgenden Reihenfolge ausgegeben werden:
- Zuerst die Bezeichnung der Stadt,
- dann die Kennzahl der Stadt und
- schließlich die Anzahl der Einwohner der Stadt.
Verwenden Sie zur Bezeichnung der Spalten dabei Namen wie folgt:
- Die Bezeichnung der Stadt soll mit einem maximal qualifizierten Namen angegeben werden.
- Die Kennzahl der Stadt soll mit einem qualifizierten Namen angegeben werden, der aber nicht vollständig qualifiziert ist.
- Die Anzahl der Einwohner der Stadt soll mit einem Bezeichner (einfachen Namen) angegeben werden.