[MySQL] バージョンが古すぎて思った処理が行えない話

2023年3月8日

eyecatch 仕事でSQLを使うことは多いのですが、色々と困りごとも多いので、実際に困った内容を備忘録します。

MySQLとPostgreSQLの方言

OSSとして、コストメリットがあるデータベースとして多く使われるのが、MySQLとPostgreSQLです。 どっちがいいかと考えてみたら、どちらにもメリットデメリットがあるので、正直どっちでもいいというのが本音です。 でも、一度どちらかを使い始めたら、別のSQLに切り替えるというのは極めて難しくなるんですよね。 なぜならそれぞれ、個別の機能を持っていて、SQLを切り替える時にその機能を使っていた場合、置き換える機能開発や翻訳を行う必要があるからなんですね。 当たり前ですが、SQL選びは非常に重要なんですよ。 また、こうした行き来を簡単にする手法として、特別な機能を使わずに、標準SQLを主体とした記述に徹底するという事で、方言を無視することも可能になります。 でも、エンジニアって、新しい機能、個別の機能を使うことにモチベーションを感じてしまう生き物なので、よほど統制しなければ、難しいかもしれませんね。

SQLiteはデータベース概念がファイル単位

SQLiteは、データベース・サーバーを立てなくてもフォルダ内で操作できる.sqlファイルがデータ本体になって、便利に使えるため、スマホアプリなどでよく使われるSQLです。 これもかなりクセが強くて、USE DATABASEという命令がそもそも無くて、1ファイルが1データベースとして扱われて、その中にテーブル群が詰め込まれている仕様になっているため、 データベースをまたぐSELECTが極めて書きにくい(ていうかどう書いて良いのかわからん)。 もしかしたら、便利に他のSQLの様にマルチDBでの記述ができるのかもしれないが、現時点で分からないので、やはり特殊仕様のSQLとして使うしかなさそう・・・と判断した。

MySQLのバージョンが古かった話

先日、MySQLを使っている会社さんのお手伝いをした時の事です。 その会社のデータベース構成がとてもイケていなくて、1つのカラム内に、カンマ区切りでマスターIDの登録がされていました。

Database : fruits

IDnamepriceitems
1Apple10010,11,12
2Orange805,6,7,8,9
3banana5015,17,19
※データ内容はブログ用のサンプルです。 普通にデータ取得すると、次のようになります。 SELECT items FROM fruits WHERE name='Apple' > items : 10,11,12 こういう状態の時に、itemsカラムのデータを,(カンマ)でsplitした状態で、列取得したいですよね? その場合、次のように書くと良いんです。 SELECT item_id FROM fruits WHERE name='Apple' cross join unnest( split(items, ',') ) as t (item_id) > item_id : 10 > item_id : 11 > item_id : 12 これをさらに、JOINなどでリレーション連結してデータを取得していけばいいのですが、 これを実行すると、MySQLでエラーが出力されてうまく動作しない・・・ もしかして・・・と思って、バージョンを確認してみる。 SELECT version(); > 5.7.37 MySQLで、unnestが使えるようになるのは、おそらくバージョン8からなのだと思った(正確に確認できていないけど、ver8でunnest使える記事が山のように検索で引っかかったので)。 こりゃあ、古いSQLバージョン使うのは、デメリットだな〜と思って、2回のSELECTを叩くことにした。

あとがき

何かと仕事で使う機会の多いSQLですが、個人的には、データ汎用性という事を重視しているため、サーバーIOを用いた独自手法を使うようにしています。 サーバーや環境依存することが無く、 運用管理が極めて楽、 処理速度もプログラミング次第で高速に行える。 こんな手法を使うエンジニアが少ないのももったいないですが、前職の秘伝のタレとして技術研究して、今の会社で実践しているSQLよりも便利な手法です。 これ使うと、もはやSQLのバージョンに悩まされる必要もないんですよね。 でも、世の中の大半の会社さんが、SQL大好きエンジニアによって、システム構築されているので、そうした会社さんには、今後もSQLにてご対応して行きたいと思っています。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。