W MySQL JOIN
, jaka jest różnica między ON
i USING()
? O ile mogę stwierdzić, USING()
jest to po prostu wygodniejsza składnia, a jednocześnie ON
daje nieco większą elastyczność, gdy nazwy kolumn nie są identyczne. Jednak różnica ta jest tak niewielka, że można by się po prostu pozbyć USING()
.
Czy jest w tym coś więcej niż na pierwszy rzut oka? Jeśli tak, które powinienem zastosować w danej sytuacji?
using
ma inne zastosowanie oprócz złączeń. Zobacz stackoverflow.com/a/13750399/632951Odpowiedzi:
Jest to głównie cukier syntaktyczny, ale na uwagę zasługuje kilka różnic:
ON jest bardziej ogólnym z dwóch. Można łączyć tabele NA kolumnie, zestaw kolumn, a nawet warunek. Na przykład:
UŻYWANIE jest przydatne, gdy obie tabele mają wspólną kolumnę o tej samej nazwie, do której dołączają. W takim przypadku można powiedzieć:
Dodatkową przyjemnością jest to, że nie trzeba w pełni kwalifikować łączących się kolumn:
Aby to zilustrować, aby zrobić powyższe z ON , musielibyśmy napisać:
Zwróć uwagę na
film.film_id
kwalifikację wSELECT
klauzuli. Powiedzenie byłoby niewłaściwe,film_id
ponieważ spowodowałoby to dwuznaczność:Jeśli chodzi o
select *
, kolumna łącząca pojawia się w zestawie wyników dwa razy za pomocą,ON
a pojawia się tylko raz za pomocąUSING
:źródło
USING
interpretujeON
.USING(
kategorię,
field_id,)
która jest przydatna przy łączeniu za pomocą kompozytowych kluczy podstawowych, słyszałem też, żeUSING
w niektórych przypadkach optymalizator poprawia wydajnośćUSING
to definicja MySQL, czy jest standardem?Pomyślałem, że przydałbym się tutaj, gdy okazałem
ON
się bardziej przydatny niżUSING
. To wtedyOUTER
sprzężenia są wprowadzane do zapytań.ON
korzysta z możliwości ograniczenia zestawu wyników tabeli, do którejOUTER
przyłącza się zapytanie, przy jednoczesnym zachowaniuOUTER
łączenia. Próba ograniczenia zestawu wyników poprzez określenieWHERE
klauzuli skutecznie zmieniOUTER
złączenie wINNER
złączenie.Oczywiście może to być względny przypadek narożny. Warto się tam jednak wystawić .....
Na przykład:
źródło
using
, jakie zapewnia, nie można go łączyć z innymi predykatami:select*from t join t2 using(i) and on 1
nie działałoby.where hasAirport ;
- co to znaczy ? nie ma żadnej wartości do porównania.SELECT * FROM country LEFT JOIN city ON country.countryId=city.countryId AND city.city BETWEEN 'C' AND 'E'
wyświetli listę wszystkich krajów, ale tylko miasta zaczynające się na C lub D (jeśli występują). (Plus miasta o nazwie „E”)Wikipedia zawiera następujące informacje na temat
USING
:Tabele, o których mówiono:
Dokumentacja Postgres również definiuje je całkiem dobrze:
źródło
Dla eksperymentujących z tym w phpMyAdminie, tylko słowo:
Wygląda na to, że phpMyAdmin ma kilka problemów
USING
. Dla przypomnienia jest to phpMyAdmin działający na Linux Mint, wersja: „4.5.4.1deb2ubuntu2”, serwer bazy danych: „10.2.14-MariaDB-10.2.14 + maria ~ xenial - dystrybucja binarna mariadb.org”.Mam biegać
SELECT
poleceń używającJOIN
iUSING
zarówno phpMyAdmin aw terminalu (wiersza poleceń), a te w phpMyAdmin produkować pewne reakcje zaskakujący:1)
LIMIT
klauzula na końcu wydaje się być ignorowana.2) przypuszczalna liczba wierszy podana na górze strony z wynikami jest czasami niepoprawna: na przykład zwracane są 4, ale na górze jest napisane: „Wyświetlanie wierszy 0–24 (łącznie 2503, zapytanie zajęło 0,0018 sekundy). „
Normalne logowanie do mysql i uruchamianie tych samych zapytań nie powoduje tych błędów. Te błędy również nie występują podczas uruchamiania tego samego zapytania w phpMyAdmin przy użyciu
JOIN ... ON ...
. Prawdopodobnie błąd phpMyAdmin.źródło