MySQLでレコードを挿入する場合、

INSERT INTO table( column1, column2 ) VALUES( value1, value2 )
INSERT INTO table SET column1=value1, column2=value2
などいくつか書き方があるようですが、これらについて

1.何か違いはあるのか
2.構文を選ぶ際に気をつけるべきことはあるか
3.なぜいろいろな書き方があるのか

を教えていただければと思います。よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/04/06 16:51:12
  • 終了:2009/04/07 15:17:41

ベストアンサー

id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542009/04/06 17:34:44

ポイント100pt

1.何か違いはあるのか

標準SQLでのINSERT文の構文は、

INSERT INTO 表名[(列名1,列名2,・・・,列名n)] VALUES(値1,値2,・・・,値n)

または、

INSERT INTO 表名[(列名1,列名2,・・・,列名n)]  SELECT文

です。

列名の並びは、表を構成する全部の列に、表の定義順で値を与える場合に省略できます。

一方、MySQLでは、標準SQLの仕様に加え、

INSERT INTO 表名[(列名1,列名2,・・・,列名n)] VALUES
(値1,値2,・・・,値n),            -- 1行目のデータ
(値1,値2,・・・,値n),            -- 2行目のデータ
・・・
(値1,値2,・・・,値n)            -- m行目のデータ

といった、複数行の値を、1個のINSERT文で格納できる機能を持っています。これは、INSERT文を1個にまとめるという記載上の特長だけでなく、クライアントからDBサーバに1回のやり取りで実行できるという性能上のメリットを持っています。

||<

また、MySQLでは、これ以外にもINSERT文で独自仕様を持っています。

その一つが、質問にある列名と値との対応を、「何番目の列に対する値か」でなく、「列名=値」というUPDATE文のSET句と同様に分かりやすくした構文です。

INSERT INTO table SET column1=value1, column2=value2

さらに、MySQLでは、INSERT文で「重複値がない場合は格納、ある場合は更新する」という独自機能を持っています。


2.構文を選ぶ際に気をつけるべきことはあるか

「MySQLしか使わない」のでないなら、MySQLの独自機能であるか、他のRDBMSでも使える機能かを知っておくべきでしょう。

他のRDBMSを使う場合や、情報処理技術者試験やベンダー試験では、当然、MySQLの独自機能は使えなかったり誤答となります。


3.なぜいろいろな書き方があるのか

いろいろなメーカーで、異なるRDBMSが開発されているからです。すでに標準SQLに入っているものならそれも踏襲されるケースが多いですが、優先度は落とされる場合もあります。

先端的あるいは特長のある独自機能も、次々と開発されて行きます。中には、その後、標準SQLに入るものもあります。

以下のようなことが普通にあります。

  1. 標準SQLにはないが、RDBMSの独自機能として実装
  2. 標準SQLにはあるが、RDBMSでは実装されていない
  3. 標準SQLにあり、RDBMSにもあるが、仕様が違う
id:yamaryoxxxx

詳細に書いていただき、どうもありがとうございます。

とてもよくわかりました!

2009/04/06 17:40:59

その他の回答(3件)

id:d-grinder No.1

ぐらいんだぁ回答回数5ベストアンサー獲得回数02009/04/06 17:20:49

ポイント40pt

INSERT INTO table( column1, column2 ) VALUES ( value1, value2 )

の書き方だと、( column1, column2 )の部分は一度書いたきりで、

INSERT INTO table( column1, column2 ) VALUES ( value1-1, value1-2 ),( value2-1, value2-2 ),...

のように複数のレコードを一気に書ける。便利。


なので、複数行の挿入をするならこちらを選ぶべきだと思うです。

自分は一行挿入の時も習慣的にこちらを使ってますねぇ。

あとは見やすさとか、そんなんでいいと思ってるんですがいかがでしょ。

id:yamaryoxxxx

複数レコードのこと、知りませんでした。なるほどありがとうございます。

2009/04/06 17:37:52
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542009/04/06 17:34:44ここでベストアンサー

ポイント100pt

1.何か違いはあるのか

標準SQLでのINSERT文の構文は、

INSERT INTO 表名[(列名1,列名2,・・・,列名n)] VALUES(値1,値2,・・・,値n)

または、

INSERT INTO 表名[(列名1,列名2,・・・,列名n)]  SELECT文

です。

列名の並びは、表を構成する全部の列に、表の定義順で値を与える場合に省略できます。

一方、MySQLでは、標準SQLの仕様に加え、

INSERT INTO 表名[(列名1,列名2,・・・,列名n)] VALUES
(値1,値2,・・・,値n),            -- 1行目のデータ
(値1,値2,・・・,値n),            -- 2行目のデータ
・・・
(値1,値2,・・・,値n)            -- m行目のデータ

といった、複数行の値を、1個のINSERT文で格納できる機能を持っています。これは、INSERT文を1個にまとめるという記載上の特長だけでなく、クライアントからDBサーバに1回のやり取りで実行できるという性能上のメリットを持っています。

||<

また、MySQLでは、これ以外にもINSERT文で独自仕様を持っています。

その一つが、質問にある列名と値との対応を、「何番目の列に対する値か」でなく、「列名=値」というUPDATE文のSET句と同様に分かりやすくした構文です。

INSERT INTO table SET column1=value1, column2=value2

さらに、MySQLでは、INSERT文で「重複値がない場合は格納、ある場合は更新する」という独自機能を持っています。


2.構文を選ぶ際に気をつけるべきことはあるか

「MySQLしか使わない」のでないなら、MySQLの独自機能であるか、他のRDBMSでも使える機能かを知っておくべきでしょう。

他のRDBMSを使う場合や、情報処理技術者試験やベンダー試験では、当然、MySQLの独自機能は使えなかったり誤答となります。


3.なぜいろいろな書き方があるのか

いろいろなメーカーで、異なるRDBMSが開発されているからです。すでに標準SQLに入っているものならそれも踏襲されるケースが多いですが、優先度は落とされる場合もあります。

先端的あるいは特長のある独自機能も、次々と開発されて行きます。中には、その後、標準SQLに入るものもあります。

以下のようなことが普通にあります。

  1. 標準SQLにはないが、RDBMSの独自機能として実装
  2. 標準SQLにはあるが、RDBMSでは実装されていない
  3. 標準SQLにあり、RDBMSにもあるが、仕様が違う
id:yamaryoxxxx

詳細に書いていただき、どうもありがとうございます。

とてもよくわかりました!

2009/04/06 17:40:59
id:kn1967 No.3

kn1967回答回数2915ベストアンサー獲得回数3012009/04/06 18:13:35

ポイント40pt
INSERT INTO table VALUES ( value1, value2 )

テーブルの構造とまったく同じ場合は構文解析の時間を節約できる分だけ

ちょっぴり高速処理が期待できますが、最近のコンピュータの計算速度から考えると

無視できるほど「ちょっぴり」なので、判読性(あとから見直す場合)を考えると

INSERT INTO table( column1, column2 ) VALUES ( value1, value2 )

という具合にフィールドを指定するほうが判りやすくて良いでしょう。


複数レコードの一括INSERTはさらに高速処理を期待でき、

判読性も高く、MySQLであればバージョン3.22.5以降で利用できるので

使えない環境のほうが少ない事でしょう。

INSERT INTO table( column1, column2 ) VALUES ( value11, value12 ),  ( value21, value22 ), ・・・

ただし、他のRDBMSでは実装が済んでいない場合も結構多いので

移植性を考慮する必要があるならば

一括INSERTは避けておいたほうがよろしいかもしれません。


SET による書き方は

phpなどのプログラムでSQLを生成する場合には便利だったりするのですが

MySQL独特のものですから、こちらも移植性を考慮する必要があるならば

避けておいたほうが無難でしょう。


回答2の後では蛇足にしかなりませんが以上、参考になれば・・・。

id:yamaryoxxxx

とんでもないです。経験が浅いのでとても参考になります。

ありがとうございます。

2009/04/06 18:19:01
id:hijk05 No.4

hijk05回答回数1307ベストアンサー獲得回数232009/04/06 22:01:06

ポイント40pt

1.何か違いはあるのか

気分の問題です。

2.構文を選ぶ際に気をつけるべきことはあるか

理由がなければ、標準SQLを使ったほうがよいです。

3.なぜいろいろな書き方があるのか

メーカが差別化を図るためですね。

たとえば、標準SQL以外で書かれたSQLをリプレースするときに、違うメーカのSQLサーバーを選択することは

事実上不可能です。

id:yamaryoxxxx

なるほど、とても納得です。

ありがとうございます。

2009/04/06 23:17:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません