Abfragen mit mehreren Tabellen

Bislang haben wir in unseren Abfragen immer genau eine Tabelle angesprochen. Das wird sich in dieser Lektion ändern. Denn durch die Kombination von Tabellen werden Dinge möglich, die über eine einfache Tabellenkalkulation wie Excel hinaus gehen.

Tabellennamen und -alias

Da jetzt Spalten aus mehr als einer Tabelle vorkommen können, sind die Spaltennamen nicht immer eindeutig. Deshalb kann es nötig sein, die Tabellen zu erwähnen, wenn wir uns auf die Spalten beziehen, beispielsweise in der Feldliste oder in der WHERE-Klausel.

Mehrdeutige Spaltennamen

SELECT id,
       firstname
  FROM tasks 
  INNER JOIN users
  ON assignee = id

In diesem Beispiel ist der Spaltenname ID nicht eindeutig, da er in beiden Tabellen vorkommt. Entsprechend kommt es zu einer Fehlermeldung:

“column ambiguously defined: ID: line 5 col 17 (at pos 81)”

Spaltennamen mit Tabellennamen

SELECT tasks.id
       users.firstname
  FROM tasks  
  INNER JOIN users 
  ON tasks.assignee = users.id

In diesem Fall sind die Spaltennamen eindeutig, da stets der Tabellenname mit angegeben wurde. Das ist aber häufig viel Schreibarbeit und wenig flexibel.

Falls eine Tabelle mehrfach vorkommt, dann funktioniert das so auch nicht mehr.

Spaltennamen mit Tabellenalias

SELECT t.id
       u.firstname
  FROM tasks AS t 
  INNER JOIN users AS u
  ON t.assignee = u.id

Wenn wir für die Tabelle mit AS einen Alias definieren, dann können wir uns bei Spaltenzugriffen darauf beziehen.

Es wird empfohlen, immer Aliasnamen zu vergeben. Darüber kann auch die Rolle der Tabelle in dieser Abfrage näher definiert werden. Wenn beispielsweise eine Tabelle USERS in einer Abfrage einmal für Projektleiter und einmal für Bearbeiter (ASSIGNEE) verwendet wird, kann man die entsprechende Aliasnamen wählen.

Spaltenalias vergeben mit AS

Mit dem Schlüsselwort AS nach einer Spalte kann man diese umbenennen. Wenn beispielsweise die ID aus mehreren Tabellen wie z.B. TASKS und USERS kommt, dann kann man den Namen entsprechend anpassen.

SELECt t.id AS task_id, 
       u.id AS user_id
  FROM tasks AS t
  LEFT OUTER JOIN users AS u
    ON t.assignee = u.id