sql >> Database >  >> RDS >> Mysql

Wat is in SQL het verschil tussen JOIN en CROSS JOIN?

SQL heeft de volgende typen joins, die allemaal rechtstreeks uit de verzamelingenleer komen:

  • Innerlijke verbinding.
    From A inner join B is het equivalent van A B, wat de verzameling elementen oplevert die beide verzamelingen gemeen hebben.

  • Linker buitenste join.
    From A left outer join B is het equivalent van (A − B) ∪ (A ∩ B). Elke A komt minimaal één keer voor; als er meerdere overeenkomende B's zijn, wordt de A één keer herhaald per overeenkomende B.

  • Rechter buitenste join.
    From A right outer join B is het equivalent van (A ∩ B) ∪ (B − A). Het is identiek aan een left join met de tafels die van plaats wisselen. Elke B zal minstens één keer verschijnen; als er meerdere overeenkomende A's zijn, wordt elke B één keer herhaald per overeenkomende B.

  • Volledige outer join.
    From A full outer join B is het equivalent van (A − B) ∪ (A ∩ B) ∪ (B − A). Elke A en elke B zal minstens één keer verschijnen. Als een A overeenkomt met meerdere B's, wordt deze één keer per wedstrijd herhaald; als een B overeenkomt met meerdere As, wordt het één keer per wedstrijd herhaald.

  • Kruis deelnemen.
    From A cross join B is produceert het cartesiaanse product A × B. Elke A wordt één keer herhaald voor elke B. Als A 100 rijen heeft en B 100 rijen, bestaat de resultatenset uit 10.000 rijen.

Opgemerkt moet worden dat de theoretische uitvoering van een select query bestaat uit de volgende stappen die in deze volgorde worden uitgevoerd:

  1. Bereken het volledige cartesiaanse product van de bronset(s) in de from clausule om de kandidaat-resultatenset te primen.

  2. Pas de deelnamecriteria toe in de from clausule en verklein de resultatenset van de kandidaat.

  3. Pas de criteria toe in de where clause om de resultatenset voor kandidaten verder te verkleinen.

  4. verdeel de kandidaatresultaten in groepen op basis van de criteria in de group by clausule.

  5. Verwijder alle kolommen uit de resultatenreeks van de kandidaat die niet zijn betrokken bij de group by clausule of betrokken bij de evaluatie van een geaggregeerde functie.

  6. Bereken de waarde van dergelijke aggregatiefuncties voor elke groep in de kandidaat-resultatenset.

  7. Vouw elke groep in de kandidaat-resultatenset samen in een enkele rij die bestaat uit de groeperingskolommen en de berekende waarden voor elke aggregatiefunctie. De kandidaat-resultatenset bestaat nu uit één rij voor elke groep, met alle kolommen behalve de group by kolommen of de rekenwaarden van geaggregeerde functies voor de groep worden geëlimineerd.

  8. Pas de criteria toe in de having clausule om de resultatenset van de kandidaat te verkleinen en de uiteindelijke resultatenset te produceren.

  9. Bestel het eindresultaat ingesteld volgens de criteria in order by clausule en zend het uit.

Er zijn meer stappen, die te maken hebben met zaken als compute en compute by clausules, maar dit is voldoende om een ​​theoretisch idee te krijgen van hoe het werkt.

Er moet ook worden opgemerkt dat alleen de meest naïeve implementatie een select . zou evalueren verklaring op deze manier, maar de geproduceerde resultaten moeten hetzelfde zijn alsof de bovenstaande stappen volledig zijn uitgevoerd.



  1. Waarom kan ik niet rechtstreeks verbinding maken met mijn MySQL RDS DB-instantie? (Ik kan alleen via SSHing verbinding maken met een EC2)

  2. Kan mysql gem niet installeren op OS X

  3. Triggers en tafelvergrendeling in MySQL

  4. Hoe koppel ik een native query aan een POJO als ik geen entiteit in mijn project heb?