Frage

Ich habe die folgende Abfrage:

SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123;

Ich habe die folgenden Fragen:

  1. Ist die VERWENDUNG von syntax gleichbedeutend mit der syntax?
  2. Sind diese Verknüpfungen werden von Links nach rechts ausgewertet?In anderen Worten, hat dieser Abfrage zu sagen:x = - Unternehmen BEITRETEN Benutzer;y = x JOIN Arbeitsplätze;z = y-JOIN useraccounts;
  3. Wenn die Antwort auf Frage 2 ist ja, ist es sicher anzunehmen, dass die Unternehmen, die Tabelle hat companyid, userid und jobid Spalten?
  4. Ich verstehe nicht, wie die WHERE-Klausel kann verwendet werden, um pick Zeilen der Tabelle Unternehmen, wenn es bezieht sich auf das alias "j"

Jede mögliche Hilfe würde geschätzt!

War es hilfreich?

Lösung

  1. MIT (fieldname) ist eine Kurzschrift Art zu sagen, AUF Tabelle1.fieldname = table2.fieldname.

  2. SQL nicht definieren die 'Ordnung' in die JOINS sind getan, weil es nicht die Natur der Sprache.Offensichtlich eine Bestellung in der Anweisung angegeben, aber eine INNERE VERKNÜPFUNG kann als kommutativ:Sie können die Liste in beliebiger Reihenfolge und erhalten Sie die gleichen Ergebnisse.

    Das heißt, beim erstellen einer ...JOIN, besonders mit dem LINKEN Verbindet, die ich gefunden habe, macht es Sinn, bezüglich der Dritten BEITRETEN der Beitritt der neuen Tabelle, um die Ergebnisse der ersten VERKNÜPFUNG, die vierte verbinden, da die Verknüpfung der Ergebnisse des zweiten zu verbinden, und so auf.

    Seltener ist die angegebene Bestellung können Einfluss auf das Verhalten der Abfrageoptimierer, die durch die Art der Einflüsse der Heuristik.

  3. Nein.Die Art und Weise der Abfrage, erfordert es, dass Unternehmen und Anwender haben beide eine companyid, Arbeitsplätze hat eine userid und ein jobid und useraccounts hat eine Benutzerkennung.Jedoch nur ein Unternehmen oder der Benutzer muss eine Benutzer-id für den BEITRITT zu arbeiten.

  4. Die WHERE-Klausel filtert die gesamte Ergebnis-dhalle verknüpften Spalten-mit einer Spalte zur Verfügung gestellt durch die jobs-Tabelle.

Andere Tipps

Ich kann nicht beantworten, die etwas über die VERWENDUNG der syntax.Das ist seltsam.Ich habe noch nie gesehen es vor, dass immer eine ON-Klausel statt.

Aber was ich können sagen Sie, dass die Reihenfolge der JOIN-Operationen wird dynamisch bestimmt, die von der Abfrage-Optimierer, wenn es Konstrukte, seinen query-plan, basiert auf einem system Optimierung, Heuristiken, von denen einige sind:

  1. Die VERKNÜPFUNG erfolgt über eine primary key-Feld?Wenn ja, wird dies mit hoher Priorität in der Abfrage-plan.

  2. Die VERKNÜPFUNG erfolgt über ein fremdschlüsselfeld?Dies bekommt auch eine hohe Priorität.

  3. Macht ein index vorhanden ist, auf das verknüpfte Feld?Wenn dem so ist, stoßen die Priorität.

  4. Ist eine JOIN-operation durchgeführt, die auf einem Feld in der WHERE-Klausel?Kann die WHERE-Klausel Ausdruck ausgewertet werden, indem die Prüfung der index (anstatt durch ausführen einer "table scan")?Dies ist eine major Optimierung Gelegenheit, so wird es eine wichtige Priorität bump.

  5. Was ist die Kardinalzahl der verknüpften Spalte?Spalten mit hoher Kardinalität geben, die der Optimierer mehr Möglichkeiten, zu diskriminieren, falsch entspricht (diejenigen, die nicht erfüllen die WHERE-Klausel oder in der ON-Klausel), so dass high-kardinalitäts-joins sind normalerweise bearbeitet vor low-kardinalitäts-joins.

  6. Wie viele tatsächliche Zeilen in der verknüpften Tabelle?Eintritt gegen eine Tabelle mit nur 100 Werten wird weniger von einer Daten-explosion als Eintritt gegen eine Tabelle mit zehn Millionen Zeilen.

Jedenfalls...der Punkt ist,...es gibt eine MENGE von Variablen, dass gehen in den Ausführungsplan für die Abfrage.Wenn Sie wollen, um zu sehen, wie MySQL optimiert seine Abfragen, die Verwendung der syntax ERKLÄREN.

Und hier ist ein guter Artikel zum Lesen:

http://www.informit.com/articles/article.aspx?p=377652


SIE AUF BEARBEITEN:

Zur Beantwortung der 4. Frage:Sie sind nicht Abfragen das "Unternehmen" - Tabelle.Du bist das Abfragen trat Kreuzprodukt ALLE vier Tabellen in der FROM-und MIT Klauseln.

Die "j.jobid" alias ist nur die voll qualifizierten Namen einer der Spalten im beigetreten Sammlung von Tabellen.

In MySQL, oft ist es interessant zu Fragen, den query optimizer, was Sie plant zu tun, mit:

EXPLAIN SELECT [...]

Finden "7.2.1 das Optimieren von Abfragen mit EXPLAIN"

FINDEN http://dev.mysql.com/doc/refman/5.0/en/join.html

UND Lesen Sie hier:


Join Verarbeitung von Änderungen in MySQL 5.0.12

Beginnend mit MySQL 5.0.12, natural joins und joins VERWENDEN, einschließlich der outer-join-Varianten, die verarbeitet werden, gemäß dem SQL:2003-standard.Das Ziel war es, richten Sie die syntax und Semantik von MySQL mit Bezug auf NATURAL JOIN und JOIN ...MIT laut SQL:2003.Allerdings werden diese änderungen in der join-Verarbeitung kann Ergebnis in verschiedene Ausgabe-Spalten für einige Verknüpfungen.Auch, einige Abfragen, die erschien, um korrekt zu arbeiten, die in älteren Versionen müssen umgeschrieben werden, dem standard zu entsprechen.

Diese Veränderungen haben fünf wesentliche Aspekte:

  • Die Möglichkeit, dass die MySQL-bestimmt das Ergebnis Spalten von NATÜRLICHEN oder MITHILFE von join-Operationen (und damit das Ergebnis des gesamten AUS-Klausel).

  • Expansion WÄHLEN Sie *, und WÄHLEN Sie Tabelle.* in die Liste ausgewählte Spalten.

  • Auflösung von Spaltennamen in der NATÜRLICHEN oder VERWENDEN von joins.

  • Transformation der NATÜRLICHEN oder VERWENDEN von joins in JOIN ...AUF.

  • Auflösung von Spaltennamen in der ON-Bedingung eines Joins ...AUF.

Ich bin nicht sicher, über die vs MIT Teil (obwohl dies website sagt, Sie sind die gleichen)

Die Bestellung Frage, seine ganz Umsetzung (und wahrscheinlich Abfrage -) spezifisch.MYSQL wahrscheinlich picks ein, um bei der Erstellung der Anfrage.Wenn Sie wollen, um die Durchsetzung einer bestimmten Reihenfolge, die Sie haben würde, um "nest" Ihre Fragen:

SELECT c.*
FROM companies AS c 
    JOIN (SELECT * FROM users AS u 
        JOIN (SELECT * FROM  jobs AS j USING(userid) 
              JOIN useraccounts AS us USING(userid) 
              WHERE j.jobid = 123)
    )

für Teil 4:die where-Klausel beschränkt, welche Zeilen aus der Tabelle Aufträge sind berechtigt zu sein, Kam auf.Also, wenn es Zeilen, die sich aufgrund der passenden Benutzerkennungen, haben aber nicht die richtige jobid dann werden Sie weggelassen werden.

1) Verwendung ist nicht genau das gleiche wie auf, aber es ist kurze hand, wo beide Tabellen haben eine Spalte mit dem gleichen Namen, den Sie schließen sich auf...siehe: http://www.java2s.com/Tutorial/MySQL/0100__Table-Join/ThekeywordUSINGcanbeusedasareplacementfortheONkeywordduringthetableJoins.htm

Es ist schwieriger zu Lesen, meiner Meinung nach, also ich würde Rechtschreibung, die verbindet.

3) Es ist nicht klar, aus dieser Abfrage, aber ich denke, es funktioniert nicht.

2) Vorausgesetzt, Sie schließen sich durch den anderen Tabellen (die nicht alle direkt auf companyies) die Reihenfolge, in der diese Abfrage nicht egal...sehen Sie Vergleiche unten:

Ursprüngliche:

SELECT c.* 
    FROM companies AS c 
    JOIN users AS u USING(companyid) 
    JOIN jobs AS j USING(userid) 
    JOIN useraccounts AS us USING(userid) 
WHERE j.jobid = 123

Was ich denke, es ist wahrscheinlich darauf hindeutet:

SELECT c.* 
    FROM companies AS c 
    JOIN users AS u on u.companyid = c.companyid
    JOIN jobs AS j on j.userid = u.userid
    JOIN useraccounts AS us on us.userid = u.userid 
WHERE j.jobid = 123

Sie wechseln können Sie Linien-Beitritt jobs & usersaccounts hier.

Was es Aussehen würde, wenn alles trat auf der Firma:

SELECT c.* 
    FROM companies AS c 
    JOIN users AS u on u.companyid = c.companyid
    JOIN jobs AS j on j.userid = c.userid
    JOIN useraccounts AS us on us.userid = c.userid
WHERE j.jobid = 123

Diese nicht wirklich logisch...es sei denn, jeder Nutzer hat seine eigene Firma.

4.) Die Magie von sql ist, dass Sie nur bestimmte Spalten, die aber alle von Ihnen werden Ihre für die Sortierung und Filterung...

wenn Sie zurückgegeben

SELECT c.*, j.jobid....  

man konnte deutlich sehen, was es war-Filterung auf, aber der Datenbank server kümmert sich nicht, wenn Sie die Ausgabe einer Zeile oder nicht für die Filterung.

Hier ist eine detaillierte Antwort auf JOIN Vorrang.In Ihrem Fall, die JOINs sind alle kommutativ.Lassen Sie uns versuchen, eine, wo Sie nicht sind.

Schema erstellen:

CREATE TABLE users (
  name text
);

CREATE TABLE orders (
  order_id text,
  user_name text
);

CREATE TABLE shipments (
  order_id text,
  fulfiller text
);

Daten hinzufügen:

INSERT INTO users VALUES ('Bob'), ('Mary');

INSERT INTO orders VALUES ('order1', 'Bob');

INSERT INTO shipments VALUES ('order1', 'Fulfilling Mary');

Abfrage ausführen:

SELECT *
  FROM users
       LEFT OUTER JOIN orders
       ON orders.user_name = users.name
       JOIN shipments
       ON shipments.order_id = orders.order_id

Ergebnis:

Nur der Bob Zeile zurückgegeben

Analyse:

In dieser Abfrage LEFT OUTER JOIN war zuerst ausgewertet und der JOIN ausgewertet wurde auf das composite-Ergebnis der LEFT OUTER JOIN.

Zweite Abfrage:

SELECT *
  FROM users
       LEFT OUTER JOIN (
         orders
         JOIN shipments
         ON shipments.order_id = orders.order_id)
         ON orders.user_name = users.name

Ergebnis:

Eine Zeile für Bob (mit der Erfüllung von Daten) und eine Zeile für Maria mit Null-Werten für die Erfüllung von Daten.

Analyse:

Die Klammern änderte sich die Bewertung um.


Weitere Dokumentation zu MySQL ist unter https://dev.mysql.com/doc/refman/5.5/en/nested-join-optimization.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top