タグ別アーカイブ: MySQL

MySQLの怖い話2

MySQL/MariaDBでテーブルの行数を確認しようとして、以下のようにミスをしてもクエリとしては動作します。ただし、意図した挙動はしませんが。
SELECT COUNT(*) FROM SOME_TABLE;

これは、FROMを忘れたことでSOME_TABLEは列名と解釈されるためです。問題はCOUNT()の方です。列名として解釈されるのは特に不思議には思えず、またFROMも構文上はオプショナルですから問題ありません。わからないのはCOUNT()が何を数えているかです。これについては今のところ回答は出ていません。

MySQL/MariaDBのワイルドカードにはlocalhostは含まれない

少なくとも、phpMyAdminでユーザを作成するとホストはワイルドカードである%となっていますが、この中にlocalhostは含まれません。従って、そのままですとローカルからはMySQLに接続できないというトラブルが発生します。この場合の対応としては以下の形でホストを変更することになります。

UPDATE mysql.user SET Host='<ホスト名>' WHERE User='<ユーザ名>';
FLUSH PRIVILEGES;

MySQLの怖い話

MySQLのSQLにはGROUP BY に特殊な特性があります。大多数のSQLではGROUP BY に指定されていない列をSELECT文で直接射影することは許されていません。

例えば、SELECT NAME FROM CUSTOMERS GROUP BY USER_IDのようなSQLはSQL Serverなどでは実行できません。なぜなら、USER_IDでグループ化しているためNAMEは確定しないためです。

ところが、MySQLではUSER_IDでグループ化して、それ以外の列をなんとなく取得できてしまいます。もし、NAMEがUSER_IDで一意に定まる場合には何らかの結果が得られる可能性はありますが一意に定まらないケースのほうが圧倒的に多いと考えられるので十分に書いている内容に注意してください。