jumper

コラム

関数と演算子

2019年08月30日
関数と演算子

データベースでも他のプログラム言語と同様に関数と演算子があります。MySQLでは関数も演算子も多く、その内容や機能も充実しています。しかし、関数や演算子を効率よく活用するためには、フィールドの型やテーブル構造などの設計から検討することが大切です。また、関数や演算子を効率よく活用することで、検索に対する負荷を軽減できます。
データベースエンジニアとしてはベースとなる知識なので、しっかり身につけてください。

数値・文字列関数と演算子

演算子には比較演算子(比較関数)と算術演算子があります。比較演算は対象とする数値や文字を比較するためのものです。そのため演算結果は真(true)か偽(false)、または1か0、またはNULLになります。
算術演算子は加減乗除などの四則演算子が代表的です。「+」は加算、「-」は引算、「*」は乗算、「/」は除算、などです。剰余や整数除算の演算子もあります。

また、MySQLにはデータベースの特質を生かした特殊な演算方法があります。我々が通常机上で行う算術とは異なり、行レベルでの演算ができます。例えば行オペランドを比較することが可能であり、行をサブクエリーとして処理できます。
MySQLには、演算子とは別に一連の処理を定義している「関数」も多く用意されています。文字列関数には文字列の長さを返すLENGTH()、複数の文字列を結合するCONCAT()、文字列の中から一部の文字列を切り出すSUBSTR()などがあります。数値関数もよくみられる機能があり、引数を丸めるROUND()、コサインやタンジェントのCOS()・COT()などがあります。

日付及び時間関数

日付および時間に関しても多くの関数が用意されています。現在の日付を返すCURDATE()、現在時間を返すCURTIME()などがあります。タイムスタンプとしてTIMESTAMP()もよく使われる関数のひとつです。

データベースでは型に相違があると処理ができません。例えば日付関数であるYEAR()には時間をあつかう機能はありません。逆にTIME()で年月日の日付を処理することはできません。その点ではフィールドのデータ型を日付型か時間型か、あるいは日付と時間をセットであつかう日付・時間型か、事前に検討しておくようにしましょう。
MySQLではデータが入力された際に、適切と思われる形式に解釈しようとします。しかし、日付と時間に許可された形式には規定がありますので、どのような形式があるか学習しておく必要があります。

全文検索関数

以前のMySQLでは全文検索のパフォーマンスが低かったのですが、5.6バージョン以降では大きく進化し、日本語での全文検索も実用化されています。

全文検索のためには全文インデックスを設定しますが、FULLTEXT型でのインデックスになります。ただし、型に制限があり、「CHAR」「VARCHAR」「TEXT」のそれぞれの型に対してインデックスが設定できます。

全文検索に使う関数はMATCH()になり、以下のようにMATCH(...)...AGAINST(...)構文で実行されます。

SELECT * FROM テーブル名 WHERE MATCH (フィールド名) AGAINST ('検索文字列' IN BOOLEAN MODE);

MATCHには検索対象のフィールド名、AGAINSTには検索文字列と検索のタイプを指定します。
また、全文検索には「自然言語検索」「ブール検索」「クエリー拡張検索」の3つのタイプが存在します。「自然言語検索」は人間が使う自然な言葉のフレーズとして解釈されます。「ブール検索」はクエリーのルール(論理)によって解釈され、フレーズではなく単語が対象とされます。「クエリー拡張検索」は自然言語検索にクエリー検索を再度行う、いわば自然言語検索にプラスした機能といえます。

まとめ

MySQLにはユーザビリティに優れた関数と演算子がそろっています。関数と演算子を使いこなしてこそ、データベースのパフォーマンスを最適に発揮できます。効果的な活用はデータベースに余計な負荷をかけないシステムを実現します。ぜひ使いこなせるように学習してください。

また、MySQLはバージョン5.6以降から大きく変化していますので、あらためてリファレンスマニュアルを確認してみると良いでしょう。普段使っている関数だけではなく、より効果的な関数を見つけることがあるかもしれません。


ソフトエイジェンシー関連製品URL

https://www.softagency.co.jp/products/mysql

CONTACT

製品・サービスに関するご質問、お見積もり、お問い合わせなど、お気軽にご連絡ください。

 050-5505-5509

受付時間 9:30 - 12:00, 13:00 - 17:00
(土日祝および年末年始を除く)