Was in den zitierten Antworten meines Erachtens zu kurz gekommen ist, ist die Frage der vervielfältigt und problematische Ergebnisse, die sich aus bestimmten (Nutzungs-)Fällen ergeben können.
(obwohl Marcelo Cantos es erwähnt)
Ich möchte ein Beispiel aus den Lagunita-Kursen von Stanford über SQL anführen.
Studententisch
+------+--------+------+--------+
| sID | sName | GPA | sizeHS |
+------+--------+------+--------+
| 123 | Amy | 3.9 | 1000 |
| 234 | Bob | 3.6 | 1500 |
| 345 | Craig | 3.5 | 500 |
| 456 | Doris | 3.9 | 1000 |
| 567 | Edward | 2.9 | 2000 |
| 678 | Fay | 3.8 | 200 |
| 789 | Gary | 3.4 | 800 |
| 987 | Helen | 3.7 | 800 |
| 876 | Irene | 3.9 | 400 |
| 765 | Jay | 2.9 | 1500 |
| 654 | Amy | 3.9 | 1000 |
| 543 | Craig | 3.4 | 2000 |
+------+--------+------+--------+
Tabelle anwenden
(Bewerbungen für bestimmte Universitäten und Studiengänge)
+------+----------+----------------+----------+
| sID | cName | major | decision |
+------+----------+----------------+----------+
| 123 | Stanford | CS | Y |
| 123 | Stanford | EE | N |
| 123 | Berkeley | CS | Y |
| 123 | Cornell | EE | Y |
| 234 | Berkeley | biology | N |
| 345 | MIT | bioengineering | Y |
| 345 | Cornell | bioengineering | N |
| 345 | Cornell | CS | Y |
| 345 | Cornell | EE | N |
| 678 | Stanford | history | Y |
| 987 | Stanford | CS | Y |
| 987 | Berkeley | CS | Y |
| 876 | Stanford | CS | N |
| 876 | MIT | biology | Y |
| 876 | MIT | marine biology | N |
| 765 | Stanford | history | Y |
| 765 | Cornell | history | N |
| 765 | Cornell | psychology | Y |
| 543 | MIT | CS | N |
+------+----------+----------------+----------+
Versuchen wir, die GPA-Werte der Studenten zu finden, die sich an folgenden Universitäten beworben haben CS
Hauptfach (unabhängig von der Universität)
Verwendung einer Unterabfrage:
select GPA from Student where sID in (select sID from Apply where major = 'CS');
+------+
| GPA |
+------+
| 3.9 |
| 3.5 |
| 3.7 |
| 3.9 |
| 3.4 |
+------+
Der Durchschnittswert für diese Ergebnismenge ist:
select avg(GPA) from Student where sID in (select sID from Apply where major = 'CS');
+--------------------+
| avg(GPA) |
+--------------------+
| 3.6800000000000006 |
+--------------------+
Verwendung einer Verknüpfung:
select GPA from Student, Apply where Student.sID = Apply.sID and Apply.major = 'CS';
+------+
| GPA |
+------+
| 3.9 |
| 3.9 |
| 3.5 |
| 3.7 |
| 3.7 |
| 3.9 |
| 3.4 |
+------+
Durchschnittswert für diese Ergebnismenge:
select avg(GPA) from Student, Apply where Student.sID = Apply.sID and Apply.major = 'CS';
+-------------------+
| avg(GPA) |
+-------------------+
| 3.714285714285714 |
+-------------------+
Es ist offensichtlich, dass der zweite Versuch in unserem Anwendungsfall zu irreführenden Ergebnissen führt, da er für die Berechnung des Durchschnittswerts Duplikate zählt. Es ist auch offensichtlich, dass die Verwendung von distinct
mit der join - basierten Anweisung wird no das Problem zu beseitigen, da es fälschlicherweise eines von drei Vorkommen der 3.9
punkten. Der richtige Fall ist die Berücksichtigung von ZWEI (2) Vorkommen des 3.9
Punktzahl, da wir tatsächlich über ZWEI (2) Studenten mit dieser Punktzahl, die unsere Abfragekriterien erfüllen.
Es scheint, dass in einigen Fällen eine Unterabfrage der sicherste Weg ist, abgesehen von etwaigen Leistungsproblemen.