sql >> Databáze >  >> RDS >> Mysql

Jaký je rozdíl mezi používáním a zapnutým spojením tabulek v MySQL?

Syntaxi USING nepoužívám od

  1. většina mých spojení pro to není vhodná (nejedná se o stejný název pole, který je porovnáván, a/nebo více shod ve spojení) a
  2. není hned zřejmé, co to znamená v případě více než dvou tabulek

tj. za předpokladu 3 tabulek se sloupci 'id' a 'id_2' ano

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

stát

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

nebo

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

nebo zase něco jiného?

Zjistit to pro konkrétní verzi databáze je poměrně triviální cvičení, ale nemám velkou jistotu, že je konzistentní ve všech databázích, a nejsem jediný, kdo musí udržovat svůj kód (takže ostatní lidé si také budou muset být vědomi toho, co je ekvivalentní).

Zjevný rozdíl mezi WHERE a ON je, pokud je spojení vnější:

Za předpokladu, že T1 s jedním polem ID, jeden řádek obsahující hodnotu 1 a T2 s polem ID a HODNOTA (jeden řádek, ID=1, VALUE=6), dostaneme:

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

nedává žádné řádky, protože WHERE se musí shodovat, zatímco

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

dá jeden řádek s hodnotami

1, NULL, NULL

protože ON je vyžadováno pouze pro shodu spojení, které je volitelné, protože je vnější.



  1. Jak mohu změnit předpony ve všech tabulkách v mé databázi MySQL?

  2. PRVG-2027 Vlastník souboru je mezi uzly nekonzistentní

  3. Jak vybrat určitý počet znaků zleva nebo zprava od řetězce na serveru SQL

  4. Jak zlepšit výkon pro databázi SQLite pro Android