sql >> Database teknologi >  >> RDS >> Mysql

Hvad er forskellen mellem at bruge og tænde i table joins i MySQL?

Jeg bruger ikke USING-syntaksen, da

  1. de fleste af mine joinforbindelser passer ikke til det (ikke det samme feltnavn, der matches, og/eller flere matches i joinforbindelsen) og
  2. det er ikke umiddelbart indlysende, hvad det oversættes til i tilfældet med mere end to tabeller

dvs. antager 3 tabeller med 'id' og 'id_2' kolonner, gør

T1 JOIN T2 USING(id) JOIN T3 USING(id_2)

blive

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)

eller

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)

eller noget andet igen?

At finde ud af dette for en bestemt databaseversion er en ret triviel øvelse, men jeg har ikke stor tillid til, at den er konsistent på tværs af alle databaser, og jeg er ikke den eneste person, der skal vedligeholde min kode (så andre mennesker skal også være klar over, hvad det svarer til).

En åbenlys forskel med WHERE vs ON er, hvis joinforbindelsen er ydre:

Hvis vi antager en T1 med et enkelt ID-felt, en række, der indeholder værdien 1, og en T2 med et ID- og VALUE-felt (en række, ID=1, VALUE=6), så får vi:

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42

giver ingen rækker, da WHERE er påkrævet for at matche, hvorimod

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)

vil give en række med værdierne

1, NULL, NULL

da ON kun kræves for at matche joinforbindelsen, hvilket er valgfrit på grund af at det er ydre.



  1. Konverter adgang til PostgreSQL?

  2. Sådan slipper du af med MySQL-fejlen 'Forberedt erklæring skal forberedes igen'

  3. Forkert strengfejl ved tilføjelse af emoji til en database via en formular

  4. Understøtter Oracle fuldtekstsøgning?