Heim  >  Artikel  >  Datenbank  >  Die grundlegende Verwendung von MySQL Left Join und der Unterschied zwischen On und Where

Die grundlegende Verwendung von MySQL Left Join und der Unterschied zwischen On und Where

WBOY
WBOYnach vorne
2023-06-02 23:54:361702Durchsuche

Vorwort

Wenn wir SQL-Anweisungen schreiben, können wir die Verwendung von Verbindungsschlüsselwörtern wie innere Verbindungen und äußere Verbindungen nicht vermeiden. Es gibt viele Typen. Ich werde hier ein Bild veröffentlichen, das ich an anderer Stelle gefunden habe:

Die grundlegende Verwendung von MySQL Left Join und der Unterschied zwischen On und Where

Es zeigt die häufigsten Linktypen in diesem Artikel. Dies ist ein Beispiel ist online definiert: Das Schlüsselwort LEFT JOIN gibt alle Zeilen aus der linken Tabelle zurück, auch wenn in der rechten Tabelle keine passenden Zeilen vorhanden sind.

Tatsächlich ist left join im wahrsten Sinne des Wortes relativ einfach zu verstehen, aber es gibt immer noch einige Probleme während der Anwendung. Wenn zum Beispiel die Ergebnisse danach völlig unterschiedlich sind, werden wir als Nächstes mehr darüber erfahren von flach nach tief verbinden.

Beispiel

CREATE TABLE `class` (
  `class_id` int NOT NULL,
  `class_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `class_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  PRIMARY KEY (`class_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

Score-Tabelle:

CREATE TABLE `score` (
  `class_id` int NOT NULL,
  `stu_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `score` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT;

Sie haben jeweils Daten:

Die grundlegende Verwendung von MySQL Left Join und der Unterschied zwischen On und Where

Die grundlegende Verwendung von MySQL Left Join und der Unterschied zwischen On und Where

F1: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id,s.score aus Klasse c Left Join Score s auf c.class_id=s.class_id.

Dieser Satz kann wie folgt umgeschrieben werden: Wir haben diese Aussage analysiert. Die linke Tabelle ist die Klassentabelle, die rechte Tabelle ist die Punktetabelle und das zugehörige Feld ist class_id. Wenn die Klassen-ID in der linken Tabelle 1 ist, gibt es in der rechten Tabelle zwei Datensätze mit der Klassen-ID 1; wenn die Klassen-ID in der linken Tabelle 2 ist, ist die Klassen-ID in den beiden Datensätzen in der rechten Tabelle 2; Die linke Tabelle ist 3, es gibt einen Datensatz in der rechten Tabelle. Die Klassen-ID des Datensatzes ist 3, also sollten wir fünf Datensätze erhalten:

1	语文	A	A002	82
1	语文	A	A001	91
2	数学	B	A002	87
2	数学	B	A001	95
3	英语	C	B003	65

Q2: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id, s.score von Klasse c links beitreten, s auf c.class_id= s.class_id und s.score=90.
Basierend auf dem Beispiel der ersten Frage hat diese eine zusätzliche Bedingung von s.score=90. Dies bedeutet, dass das Punktefeld der rechten Tabelle 90 beträgt, aber wenn wir uns die Daten in der Tabelle ansehen, stellen wir fest dass es in der rechten Tabelle keine Punktzahl von 90 gibt, ok, wird das Ergebnis leer sein? Schließlich enthält die Tabelle rechts keine Daten, die die Bedingungen erfüllen.

Wenn Sie diese SQL-Anweisung ausführen, erhalten Sie zwar letztendlich das Ergebnis, aber nur drei Daten. Alle Felder in der linken Tabelle werden angezeigt und alle Felder in der rechten Tabelle sind leer. Dies liegt daran, dass die rechte Tabelle keinen Datensatz in der Tabelle hat. Die Punktzahl beträgt 90, sodass die Felder in der rechten Tabelle leer sind.

on filtert die Daten zuerst und verbindet sie dann, während where die Daten nach einer verwandten Abfrage zwischen den beiden Tabellen filtert. Die folgenden Beispiele behandeln diese beiden Unterschiede.

1	语文	A		
2	数学	B		
3	英语	C

Q3: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id,s.score aus der Klasse c aus, verbinden Sie die Punktzahl s auf c.class_id=s.class_id, wobei c.class_name=‘中文’ unds.score=90.

Sie müssen auf den Unterschied zwischen where und on achten, da diese Aussage das Schlüsselwort where beinhaltet. Das Abfrageergebnis dieser SQL ist leer. Dies liegt daran, dass die beiden Tabellen zuerst verbunden werden, um die Ergebnisse abzufragen, und dann gefiltert werden. Das Ergebnis der Abfrage der verbundenen Tabelle ist, dass kein Datensatz vorhanden ist, der mit class_name=„中文“ übereinstimmt. und Score = 90, also ist das Abfrageergebnis leer.

F4: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id,s.score aus der Klasse c aus, verbinden Sie die Punktzahl s auf c.class_id=s.class_id und 1=0.

Manchmal fügen wir nach der Where-Bedingung von SQL 1=1 hinzu, und 1=0 bedeutet hier, dass die Zuordnung zwischen den beiden Tabellen fehlgeschlagen ist, sodass im Ergebnis nur die Daten aus der linken Tabelle angezeigt werden.

1	语文	A	null	null
2	数学	B	null	null
3	英语	C	null	null

Q5: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id,s.score aus der Klasse C aus, verbinden Sie die Punktzahl s auf 1=0.

Das Ausführungsergebnis ist das gleiche wie bei der obigen SQL-Anweisung. Tatsächlich wird der gesamte Inhalt der linken Tabelle angezeigt.

1	语文	A	null	null
2	数学	B	null	null
3	英语	C	null	null

F6: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id,s.score aus Klasse C aus, verbinden Sie die Punktzahl s auf c.class_id=s.class_id und c.class_name=‘中文’ .

Dazu müssen die Datensätze in der rechten Tabelle herausgefiltert werden, deren Klassenname Chinesisch ist (es gibt zwei), und dann die beiden Datensätze in der linken Tabelle verbunden werden, sodass es nicht schwer zu erkennen ist, dass es vier Ergebnisse gibt:

1	语文	A	A002	82
1	语文	A	A001	91
2	数学	B	null	null
3	英语	C	null	null

Q7: Wählen Sie c.class_id,c .class_name,c.class_grade,s.stu_id,s.score aus Klasse c aus, verbinden Sie Score s auf c.class_id=s.class_id und c.class_name=‘Englisch’.

Die Analyse ist die gleiche wie bei der vorherigen Frage (das Ergebnis im leeren Bereich ist null):

1	语文	A		
2	数学	B		
3	英语	C	B003	65

F8: Wählen Sie c.class_id,c.class_name,c.class_grade,s.stu_id,s.score aus dem Klassen-C-Join aus hinterließ Punkte auf c .class_id=s.class_id und c.class_name=‘sports’.

Die rechte Tabelle enthält keine Daten und der Klassenname lautet „Sport“, sodass die rechte Tabelle leer ist und alle Daten in der linken Tabelle angezeigt werden. Die entsprechenden Felder in der rechten Tabelle sind leer:

1	语文	A		
2	数学	B		
3	英语	C

Q9: Wählen Sie c .class_id,c.class_name,c .class_grade,s.stu_id,s.score von Klasse c links beitreten s auf c.class_id=s.class_id und c.class_name=‘中文’

右表中只有一条记录的score为91,所以需要拿左表与右表的这一条数据进行关联,左表只有语文可以与右表的那一条数据对上,所以结果为:

1	语文	A	A001	91
2	数学	B		
3	英语	C

Q10:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id and c.class_name=‘体育’ and s.score=90。

右表中没有数据的score为90,同样左表中也没有class_name为体育,但是这并不意味着最后的结果就是空了,只要没有where条件,最终的结果数量最起码也会是左表中原先的数据数量,所以这条sql会返回左表的全部数据。

1	语文	A		
2	数学	B		
3	英语	C

Q11:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘英语’。

需要注意的点:条件是在where中的,也就是在表关联之后,再进行过滤的,所以最终的结果只会有一条:

3	英语	C	B003	65

Q12:select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where s.score=91。

和上面一样,是在连表查询之后,找出score=90的数据:

1	语文	A	A001	91

Q12;select c.class_id,c.class_name,c.class_grade,s.stu_id,s.score from class c left join score s on c.class_id=s.class_id where c.class_name=‘语文’ and s.score=91。

我们将两表连接查询后,找出结果中class_name为语文,score为91的记录,只有一条:

1	语文	A	A001	91

Das obige ist der detaillierte Inhalt vonDie grundlegende Verwendung von MySQL Left Join und der Unterschied zwischen On und Where. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen