はじめまして。
先月(2013年12月)アライドアーキテクツに入社しました、佐藤 知明と申します。
現在はモニプラ for Facebookの開発を担当しております。
前職では業務系パッケージシステムの開発・保守を担当しており、
PL/SQLを使用してきました。
今回のブログでは、今までOracleSQLを使用していた私が、
MySQLを使ってみて便利だと感じたことを2つほど書いてみました。
私と同じようにOracleSQLを使っていた人がMySQLを使い始める場合、
参考にしていただければと思います。
1,複数行をまとめたINSERT文
以下のテーブルに3レコードINSERTしてみようと思います。
person
|
MySQLでは複数行のINSERT文は下記のようにレコード毎にカンマ区切りで記載できます。
1 2 3 4 |
INSERT INTO test_table (id, name, status) VALUES (1, 'test1', 9), (2, 'test2', 9), (3, 'test3', 8); |
実行結果
1 2 3 4 5 6 |
mysql> INSERT INTO test_table (id, name, status) VALUES -> (1, 'test1', 9), -> (2, 'test2', 9), -> (3, 'test3', 8); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 |
ところが同じSQL文をOracleSQLで実行すると、
下記のようにエラーが発生します。
1 2 3 4 5 6 7 8 |
SQL> INSERT INTO test_table (id, name, status) VALUES 2 (1, 'test1', 9), 3 (2, 'test2', 9), 4 (3, 'test3', 8); (1, 'test1', 9), * 行2でエラーが発生しました。: ORA-00933: SQLコマンドが正しく終了されていません。 |
OracleSQLで複数行のINSERT文を発行するためには、
1 2 3 |
INSERT INTO test_table (id, name, status) VALUES (1, 'test1', 9); INSERT INTO test_table (id, name, status) VALUES (2, 'test2', 9); INSERT INTO test_table (id, name, status) VALUES (3, 'test3', 8); |
や
1 2 3 4 |
INSERT ALL INTO test_table (id, name, status) VALUES (1, 'test1', 9) INTO test_table (id, name, status) VALUES (2, 'test2', 9) INTO test_table (id, name, status) VALUES (3, 'test3', 8); |
のように記述する必要があり、
「INTO test_table (id, name, status) VALUES」の部分が毎行必須となるため、
MySQLのようにカンマ区切りでINSERT文が発行できてちょっと楽になったと感じました。
2,MySQLではGROUP BYに列番号や列別名を指定できる
1のINSERT文から話は変わるのですが、
もうひとつ、GROUP BYの使い方にMySQLとOracleSQLの違いがありました。
OracleSQLでは、GROUP BY句に列番号も列別名も使えないため、
以下のSQLではともにエラーが発生します。
1 2 |
select substr(status,1,1) stat, count(*) from test_table group by 1; select substr(status,1,1) stat, count(*) from test_table group by stat; |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
SQL> select substr(status,1,1) stat, count(*) from test_table group by 1; select substr(status,1,1) stat, count(*) from test_table group by 1 * 行1でエラーが発生しました。: ORA-00979: GROUP BYの式ではありません。 SQL> select substr(status,1,1) stat, count(*) from test_table group by stat; select substr(status,1,1) stat, count(*) from test_table group by stat * 行1でエラーが発生しました。: ORA-00904: "STAT": 無効な識別子です。 |
OracleSQLでは、以下のようにselect句とgroup by句に同じ記述を書く必要があります。
1 |
select substr(status,1,1) stat, count(*) from test_table group by substr(status,1,1); |
実行結果
1 2 3 4 5 6 |
SQL> select substr(status,1,1) stat, count(*) from test_table group by substr(status,1,1); ST COUNT(*) -- ---------- 8 1 9 2 |
ところが、MySQLではgroup by句に列番号や列別名を指定してもエラーが発生しません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
mysql> select substr(status,1,1) stat, count(*) from test_table group by 1; +------+----------+ | stat | count(*) | +------+----------+ | 8 | 1 | | 9 | 2 | +------+----------+ 2 rows in set (0.01 sec) mysql> select substr(status,1,1) stat, count(*) from test_table group by stat; +------+----------+ | stat | count(*) | +------+----------+ | 8 | 1 | | 9 | 2 | +------+----------+ 2 rows in set (0.01 sec) mysql> select substr(status,1,1) stat, count(*) from test_table group by substr(status,1,1); +------+----------+ | stat | count(*) | +------+----------+ | 8 | 1 | | 9 | 2 | +------+----------+ 2 rows in set (0.00 sec) |
実際のコーディングでは、
group by句に列番号を入れるとどの列のことを指しているのか
後から分かりづらくなるために使わない方がいいと思いますが、
調べ事をする際にちょっとSQLを打つ際などには、
列番号や列別名をGROUP BY句に使用できるのは便利かと思います。
他にもOracleSQLに比べてMySQLの便利な点は多々あると思いますので、
今後調べてみようと思います。
今回は以上になります。
アライドアーキテクツではエンジニアを随時募集しております。
興味があればぜひこちらの採用サイトからご応募ください。
モニプラ for Facebookの開発を担当しております。 現在PHPの勉強中なので、その過程で学んだことや感じたを書いていきたいと思います。