2018年11月10日追記
タイトルとタグを変更しました。
最初はgroup byについてのみ記載するつもりでしたが下記のお仕事をしていく中で他にも知らなかったMySQL独特の文法・特徴があるのを知りました。
それらに悩まされることが増えたのでそれについても下に追記していきます。
基本私が仕事でなんじゃこりゃとなったものを記載していく予定なので差異を網羅するような内容にはなっていません。
またgroup byについてだけ詳しく書いてますが消したりはしないでおこうと思います。
はじめに
私は現在仕事でMySQLで手バッチ実行するシステム????の刷新をしています。
AbinitioというBIツールを使っています。
その中でちょっと驚いた事があったので備忘も兼ねて投稿します。
そんなの当たり前じゃんって言わないでね。
どんなお仕事をしているか?
MySQL上のデータ(だいたい数百万件とかそんくらい)をAbinitioってBIツールを使って自動化、高速化するお仕事です。
それにあたり現在動いているSQLをツール上に取り込む必要があります。
ある一定レベルは自動でやってくれるんですがこのツールはANSI対応のものしか組み込まれていません。
そのためMySQLの独自の関数、仕様的なものは都度対応していかないといけないといった感じです。
group byについて
SQLでレコードを集約して取得する方法です。
例えば

こんなテーブル1があって
select カラム1、カラム2
form テーブル1
group by カラム1、カラム2
というSQLを投げた場合

こんな感じでデータが取れます。
(1と2のレコードが集約される)
ここで大切なのはselectのあとで取得しているカラムとgroup byのあとで指定している項目は同じものを指定しないといけないことです。
group byで指定せずselectで取得できるのはsumやcount関数を使用した項目になります。
ここで私が驚いたことですがMySQLでは上記のルールを守らなくていいらしいです。
なので通常ではエラーになる
select カラム1、カラム2
form テーブル1
group by カラム1
こんなのも実行できます。
ちなみにその時テーブルが

こんな形だった場合、2と3のレコードは集約されるわけですがカラム2が違うのでどちらが表示されるかわからないらしいです。
(基本上にある2のほうが表示されるようですが)
MySQL での GROUP BY の処理
こちらにも記載がありますが
この機能を使用すると、不要なカラムのソートおよびグループ化が回避されるため、パフォーマンスを改善できます。
ただし、これは主に、GROUP BY で名前が指定されていない各非集約カラム内のすべての値がグループごとに同じである場合に役立ちます。
ということで1つ目みたいなテーブルだとわざわざ2つ指定しなくていいから有効だけど2つ目みたいなテーブルでは良くないよってことみたいです。
insert文のカラム指定(以下2018年11月10日追記)
上記のgroup byのような話がinsert時もあるようです。
具体的に説明すると上記で説明したカラムが2つあるテーブルに対して
insert カラム1 value(A);
みたいなSQLを実行した場合、カラム2の設定がないためエラーが発生します。
ただMySQLの場合、特にエラーなく実行されカラム2にはデフォルト値として設定した値が入るようです。
ignore
エラーを無視する魔法の呪文()
例えば登録処理をするときなどPKエラーが発生するような内容だとその旨エラーが発生します。
そのエラーを無視して次のSQLの実行等を行うというもの(エラー自体が発生してないように見える)
データの登録自体は行いません。
連続してSQLを実行して途中で止まると困るみたいな場合や一旦selectかけて調べるのめんどくさいみたいな場合に使うんだと思われますがあまりよくない(っていうか使ってほしくない)と思います。
命名ルール
Oracleなど(私が今使ってるツールも)カラム、テーブルの名前に先頭は数字が使えません。
MySQLだと使えるようです。
仕事でもバンバン出てくるので置換してます・・・
NULLの扱い
MySQL(PostgreSQLでも)NULLと空文字を区別しましす。
またその区別をつけるためかcsvとしてexportするとデータにNULLとして入ったりします。
このデータを取り込むとNULLを文字列として認識するので全部エラーになっています・・・
DUAL表
日付などの演算を行うとき仮のテーブルとしてOracleではDUAL表の指定を行います。
PostgreSQLではDUALという概念がないようです。
MySQLではどちらでも実行できるようです。
組み込み関数について
これはMySQLに限らず結構差異がある感じです。
止むえない部分ですが関数名が同じだけど引数が違うとかだと結構ややこしくなってきますね。
型定義について
OracleとPostgreSQL、MySQLを比較すると文字列、数値型の定義が異なるみたいですね。
ここらへんも関数と同じで違うものに移行する際は気をつけないと行けないポイントだと思います。
ただ日付型についてMySQLは独特の定義をしています。
Oracle、PostgreSQL:YYYYDDMMHHMISS
MySQL:%Y %D %M %h:%i:%s