
MySQLで複数テーブルからデータ取得する際、
FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、
「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか?
・「INNER JOIN」と同じ意味でしょうか?
・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか?
・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか?
・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…
No.2ベストアンサー
- 回答日時:
select *
from 表A, 表B
where 表A.列1 = 表B.列2 and 表A.列3 = 値
と
select *
from 表A inner join 表B on 表A.列1 = 表B.列2
where 表A.列3 = 値
は同じ結果となります。前者の方が古くからある構文,後者が新しい構文になります。新しいといっても20年は経っていますけれど。
> 普通は、どちらの書き方で書くとか、
> そういうお作法的な暗黙の了解はあるでしょうか?
旧構文は,結合を指定する要素がfrom句とwhere句に分かれてしまっているのに対して,
新構文では次のように各句の機能が明確ですから,join句の使用をお薦めします。
射影…select *
結合…from 表A inner join 表B on 表A.列1 = 表B.列2
選択…where 表A.列3 = 値
> 書き方によっては「LEFT OUTER JOIN」みたいにも書けるのでしょうか?
旧構文で外部結合を記述することもできますが,各データベース製品の独自構文になります。標準SQLの規格ではありません。
> 「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか
そういう制限はありません。
No.1
- 回答日時:
>FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、
>「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか?
WHEREは古いやり方で、JOIN ONは新しいやり方で、書き方以外の違いは無いと思います。
>「INNER JOIN」と同じ意味でしょうか?
そうです。
>書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか?
Oracleの場合(+)を付けて可能ですがMySQLは多分出来ないと思います。
>普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか?
>例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…
どちらも規格になっているので良いと考えますが、後で見たときにINNER JOINの方が結合の条件がONでのみ確定するので解析しやすいと思います。
回答ありがとうございました。
>Oracleの場合(+)を付けて可能ですがMySQLは多分出来ないと思います
・Oracleに言及している記述は見たことがあるのですが、MySQLに関しては触れられていなかったので、疑問に思っていました
・大変参考になりましたー
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT関数の代替方法は?
-
【Transact-sql】 where条件、i...
-
Accessの「IIF」に相当するSQL...
-
BULK INSERT時のNull許容について
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
type date にnullをinsert
-
mysqlで50音順にorder byしたい。
-
UNIONする際、片方テーブルしか...
-
MYSQLで全てのカラムから検索す...
-
ドロップダウンリストの連動し...
-
SQLServerでNULLを挿入したいです
-
SQL、oracleにて文字列操作(連...
-
now()かCURRENT_TIMESTAMPか
-
SQLでカラムを追加し、条件に合...
-
一部のカラムでdistinctし全て...
-
スペースによる絞り込み検索をS...
-
GREATESTで NULLをスルーする方...
-
複数カラムに対するLIKE文の最適化
-
巨大テーブルからインデックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT関数の代替方法は?
-
BULK INSERT時のNull許容について
-
【Transact-sql】 where条件、i...
-
Accessの「IIF」に相当するSQL...
-
自分自身のテーブルを参照して更新
-
SQLiteで「UPDATE table1 SET c...
-
sqlite3でrowid以外にid必要で...
-
mongoDBについて質問です
-
Accessで複数(3以上)...
-
create tableのフィールド名
-
列を行に表示する方法は?
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
一部のカラムでdistinctし全て...
-
SQLServerでNULLを挿入したいです
-
UNIONする際、片方テーブルしか...
-
MYSQLで全てのカラムから検索す...
-
AUTO_INCREMENTに0はダメ?
-
group byで最後のレコードを抽...
-
GREATESTで NULLをスルーする方...
おすすめ情報