-> (MySQL) -> doppeltes select mit 2 Tabellen, Rationalisierung
Aquariophile
- datenbank
Hallo!
Vorhanden sind 2 Tabellen in MySQL:
mysql> select * from users;
+----+--------+-----------+
| id | user | pass |
+----+--------+-----------+
| 1 | tom | sdfsdf |
| 2 | cool | 4fds |
| 3 | bla | ret |
| 4 | caesar | sadsa43 |
| 5 | Zorro | jksr |
| 6 | Comics | 4354gtfdg |
+----+--------+-----------+
6 rows in set (0.00 sec)
mysql> select * from datas;
+----+--------+-----------+
| id | sex | city |
+----+--------+-----------+
| 1 | male | New York |
| 2 | male | Vienna |
| 3 | female | Colorado |
| 4 | male | Rom |
| 5 | female | Wisconsin |
| 6 | male | Berlin |
+----+--------+-----------+
6 rows in set (0.00 sec)
Ich will alle Staedte (city) aus "datas" ausgeben,
wo die ID die gleiche ist, wie die in "users",
wo die Spalte user mit C beginnt.
Zwei verschiedene Abfragen bekam ich zum laufen:
SELECT d.city FROM datas d LEFT JOIN users u ON d.id = u.id WHERE u.user LIKE 'c%';
SELECT d.city FROM datas d, users u WHERE d.id = u.id AND u.user LIKE 'c%';
a)
Sind beide absolut korrekt,
oder ist das 2. mehr oder minder Zufall dass es geht
und man sollte es nicht verwenden?? (Vermutung)
Ich vermute das weil das 2) fast das gleiche ist wie das 1)
aber ur viele Sachen wie LEFT JOIN und ON und so weggelassen wurden,
schaut irgendwie so falsch aus *g*
b)
Kann mir bitte jemand erklaeren was LEFT JOIN macht und was ON macht?
Die englische Dokus dazu sind mir zu kompliziert.
Was waere eigentlich RIGHT JOIN ?? gibts das?
Aber wichtig sind eben:
Was ist
LEFT JOIN
und ON
DANKE!!
Aqua
Hallo,
SELECT d.city FROM datas d LEFT JOIN users u ON d.id = u.id WHERE u.user LIKE 'c%';
2)
SELECT d.city FROM datas d, users u WHERE d.id = u.id AND u.user LIKE 'c%';Fragen
a)
Sind beide absolut korrekt,
Ja.
oder ist das 2. mehr oder minder Zufall dass es geht
und man sollte es nicht verwenden?? (Vermutung)
Nein.
Die Abfragen ergeben allerdings _nicht_ immer identische Ergebnisse.
SELECT d.city FROM datas d LEFT JOIN users u ON d.id = u.id WHERE u.user LIKE 'c%';
Wähle Datensätze aus der Tabelle daten, verbunden mit der Tabelle users, wobei die Ergebnismenge _alle_ Datensätze aus daten(left) und nur die Datensätze aus users(right) enthält, bei denen users.id=daten.id ist. Filtere aus der Ergebnismenge die datensätze heraus, bei denen users.user mit c beginnt.
SELECT d.city FROM datas d RIGHT JOIN users u ON d.id = u.id WHERE u.user LIKE 'c%';
Wähle Datensätze aus der Tabelle daten, verbunden mit der Tabelle users, wobei die Ergebnismenge _alle_ Datensätze aus users(right) und nur die Datensätze aus daten(left) enthält, bei denen daten.id=users.id ist. Filtere aus der Ergebnismenge die datensätze heraus, bei denen users.user mit c beginnt.
SELECT d.city FROM datas d INNER JOIN users u ON d.id = u.id WHERE u.user LIKE 'c%';
Wähle Datensätze aus der Tabelle daten, verbunden mit der Tabelle users, wobei die Ergebnismenge nur die Datensätze aus daten(left) und nur die Datensätze aus users(right) enthält, bei denen users.id=daten.id ist. Filtere aus der Ergebnismenge die datensätze heraus, bei denen users.user mit c beginnt.
SELECT d.city FROM datas d, users u WHERE d.id = u.id AND u.user LIKE 'c%';
Wähle alle Datensätze aus der Tabelle daten, verbunden mit allen Datensätzen der Tabelle users. Filtere aus der Ergebnismenge die datensätze heraus, bei denen daten.id = users.id ist und users.user mit c beginnt. Das entspricht einem INNER JOIN.
Was schneller ist, JOIN oder WHERE, hängt vom DBMS ab. Es sollte aber bei modernen DBMS in etwa gleich schnell sein. Meiner Meinung nach sollte man aber JOIN zum Verknüpfen von Tabellen und WHERE zum Filtern nehmen. Einfach der besseren Übersicht wegen. Ich würde also:
SELECT d.city FROM datas d INNER JOIN users u ON d.id = u.id WHERE u.user LIKE 'c%';
bevorzugen.
LEFT JOIN und RIGHT JOIN bringen dann andere Ergebnisse als INNER JOIN, wenn in einer der Tabellen Datensätze stehen, deren id von den ids der anderen Tabelle abweicht. Diese Datensäze sind bei INNER JOIN nie im Ergebnis, bei RIGHT JOIN sind sie dann im Ergebns, wenn die zusätzlichen ids in der rechten Tabelle stehen und bei LEFT JOIN entsprechen, wenn sie in der linken Tabelle stehen.
viele Grüße
Axel