sql >> Database >  >> RDS >> Mysql

MijnSql. Zelf deelnemen gebruiken

Je bent zo dichtbij!

Aangezien u zegt dat u het land en het jaar vanaf A weergeeft en beperkt tot A. Country van Turkije, Turkije is alles wat je gaat zien. U moet ofwel de selecties wijzigen in B.country en B.year of verander de waar-clausule in B.country .

Dit maakt gebruik van een cross join die langzamer wordt naarmate er meer records in een tabel zijn.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a, 
     table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

zou kunnen worden geschreven als... en zou waarschijnlijk hetzelfde uitvoeringsplan hebben.

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a 
CROSS JOIN table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

OFDit maakt gebruik van een INNER JOIN die het werk dat de motor moet doen, beperkt en geen last heeft van prestatievermindering die een cross-join zou hebben.

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a 
INNER JOIN table1 AS b 
   on a.Year=b.Year 
  and b.Country='Turkey';

WAAROM:

Bedenk wat de SQL-engine zal doen als de join plaatsvindtA B

+------------+------+--------+------------+------+--------+
| A.Country  | Rank |  Year  | B.Country  | Rank |  Year  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 

Dus toen je zei:toon A.Country en A.Year waar A.Country is Turkije, je kunt zien dat het alleen Turkije kan retourneren (vanwege het onderscheidende slechts 1 record)

Maar als je B.Country . doet is Turkije en toon A.Country , krijg je Frankrijk, Canada en Turkije!



  1. CURRENT_TIME Voorbeelden – MySQL

  2. Een kolom toevoegen die een aaneenschakeling van twee andere Varchar-kolommen vertegenwoordigt

  3. Hoe voeg ik opmerkingen toe aan een tabel in Oracle SQL Developer?

  4. Optimalisatie van MySQL-prestaties:volgorde op datum/tijd-veld