Torsten.E wrote:1.
Wie erhalte ich das Ergebnis i_tiere.id, i_adressen.id ohne dass ich für jedes Feld einen Alias angeben muß.
Gar nicht. Es ist präzise der Grund für die Erfindung von AS solche Uneindeutigkeiten auflösen zu können. SELECT * ist sowieso schlechter Stil und sollte in Code nicht verwendet werden.
Guter Stil ist es auch, für jede Tabelle einen Kurznamen zu haben, und alle Spalten einer Tabelle mit dem Kurznamen zu präfixen (außer, wenn sie Fremdschlüssel sind).
Das wäre dann also "t" für Tiere, mit einer t_id, und "a" für Adressen mit einer a_id. Wenn eine Adresse zu einem Tier gehört, und deswegen an jeder Adresse eine t_id gespeichert wird, dann wird das Feld dafür a.t_id benannt.
In einem Join hast Du so immer eindeutige Feldnamen.
2.
Was bedeutet eigentlich "inner" und "outer" beim JOIN ?
Ein Join zwischen zwei Tabellen t1, t2 ist das Kreuzprodukt beider Tabellen, d.h. es wird intern jede Zeile aus t1 mit jeder Zeile aus t2 kombiniert.
In einem Inner Join werden nun aus dieser Grundmenge diejenigen Kombinationen von ( t1.*, t2.* ) selektiert, für die die Joinbedingung wahr ist.
In einem Left Outer Join werden ebenfalls alle Kombinationen aus (t1.*, t2*) selektiert, für die die Joinbedingung wahr ist, und dazu kommen dann noch alle bisher noch fehlenden Zeilen aus t1.*, wobei hier die nicht vorhandenen t2.* Werte mit NULL aufgefüllt werden.
Daher ist in einem Inner Join auf der Bedingung t1.t1_id = t2.t1_id immer t1.t1_id = t2.t1_id und beide sind austauschbar zu gebrauchen (etwa: count(t1_id) ist definiert und gleich, egal ob man t1.t1_id oder t2.t1_id in der Zählung verwendet).
In einem Left Outer Join dagegen kann t2.t1_id NULL sein, während t1.t1_id definiert ist. Entsprechend macht es einen Unterschied, ob man count(t1.t1_id) oder count(t2.t1_id) abfragt (Count zählt NULL-Werte nicht mit (und daher ist es auch ein Unterschied, ob man count(*) oder count(spaltenname) bestimmt)).