[解決済み】MySQL JOIN ON vs USING?
2022-03-28 04:23:49
質問
MySQLで
JOIN
とはどのような違いがあるのでしょうか?
ON
と
USING()
? 私が知る限りでは
USING()
はより便利な構文であるのに対し
ON
は、カラム名が同一でない場合に、もう少し柔軟性を持たせることができます。しかし、この差は非常に小さいので、このままでは
USING()
.
これには何か理由があるのでしょうか?もしそうなら、ある状況下でどちらを使うべきでしょうか?
どのように解決するのですか?
ほとんど構文上の糖分ですが、いくつかの違いが注目されます。
オン は、この2つのうちより一般的なものです。あるカラム、カラムのセット、さらには条件によってテーブルを結合することができます。例えば
SELECT * FROM world.City JOIN world.Country ON (City.CountryCode = Country.Code) WHERE ...
使用中 は、両方のテーブルがまったく同じ名前のカラムを共有しており、そのカラムで結合する場合に便利です。この場合、次のように言うことができます。
SELECT ... FROM film JOIN film_actor USING (film_id) WHERE ...
さらに、結合カラムを完全に修飾する必要がないのも良い点です。
SELECT film.title, film_id -- film_id is not prefixed
FROM film
JOIN film_actor USING (film_id)
WHERE ...
例として、上記を ON と書くことになる。
SELECT film.title, film.film_id -- film.film_id is required here
FROM film
JOIN film_actor ON (film.film_id = film_actor.film_id)
WHERE ...
ここで
film.film_id
の資格は
SELECT
節を使用します。と言うだけでは無効です。
film_id
曖昧な表現になってしまうからです。
エラー 1052 (23000)。フィールドリスト内の列 'film_id' はあいまいです。
については
select *
で、結合カラムは結果セットに2回表示されます。
ON
で1回だけ表示されるのに対し
USING
:
mysql> create table t(i int);insert t select 1;create table t2 select*from t;
Query OK, 0 rows affected (0.11 sec)
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.19 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select*from t join t2 on t.i=t2.i;
+------+------+
| i | i |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
mysql> select*from t join t2 using(i);
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql>
関連
-
[解決済み] MySQLが重複したレコードを削除し、最新のレコードを保持する
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] INNER JOIN ON vs WHERE句
-
[解決済み] SQL ServerでJOINを使用してテーブルを更新しますか?
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】ジョインとサブクエリの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MySQLのDESCRIBE [table]に相当するSQLiteはあるか?]
-
[解決済み] MySQL エラー: キーの長さがないキー指定
-
[解決済み] mysqldです。dir を data に変更できません。サーバーが起動しません
-
[解決済み] ERROR 1148: 使用されたコマンドはこのMySQLバージョンでは許可されていません。
-
[解決済み] MySQLで週単位でグループ化する方法は?
-
[解決済み] 日付の挿入時にエラーが発生しました - 日付の値が正しくありません。
-
[解決済み] MySQLの グループ関数の無効な使用
-
[解決済み] USINGキーワード vs ON句 - MYSQL [重複].
-
[解決済み] MySQLでJoinを使った削除
-
[解決済み】自然結合と内部結合の違いについて