MySQLサーバには、他の SQL データベースにはない拡張機能があります。それらの拡張機能を使用した場合、他の SQL サーバにコードを移植できなくなるので注意してください。場合によっては、MySQL 拡張機能を含むコードを記述しても、次の形式のコメントを使用することで移植することができます。
/*! MySQL-specific code */
その場合、MySQL サーバでは、他の MySQL
ステートメントと同様にコメント内のコードが解析および実行されますが、他の
SQL
サーバでは拡張機能が無視されます。例えば、MySQLサーバは次のステートメント内のSTRAIGHT_JOINキーワードを認識しますが、他のサーバでは認識されません。
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
‘!’の後ろにバージョン番号を追加すると、MySQL
バージョンが、使用されているバージョン番号以降の場合にのみ、構文が実行されます。
バージョン 3.23.02
以降を使用している場合、MySQL サーバで
次のコメント内のTEMPORARYキーワードが使用されます。
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
以下は、MySQL 拡張機能の一覧です。
ディスク上のデータ構成
MySQL サーバでは、各データベースは MySQL データディレクトリ下のディレクトリに、データベース内のテーブルはデータベースディレクトリ内のファイル名にマップされます。これには、次のような意味があります。
ほとんどの Unix システムのようにファイル名で大文字と小文字が区別されるオペレーティングシステム上の MySQL サーバでは、データベース名およびテーブル名は大文字と小文字を区別されます。項8.2.2. 「識別子の大文字/小文字区別」 を参照してください。
MyISAMストレージエンジンを使用して、テーブルのバックアップ、名前の変更、移動、削除、およびコピーを行うことができます。たとえば、MyISAMテーブルの名前を変更するには、テーブルに対応する.MYD、.MYI、および.frmファイルの名前を変更します。(ただし、RENAME
TABLEやALTER TABLE ...
RENAMEを使用して、サーバにファイル名を変更させるほうが好ましいでしょう。)
データベースとテーブル名は、パスネーム分離文字(‘/’や‘\’)を含むことはできません。
一般言語構文
デフォルトでは、文字列は‘'’だけでなく、‘"’や‘'’のいずれかでも囲むことができます。(ANSI_QUOTES
SQLモードが有効な場合、文字列は‘'’のみでしか囲むことができず、サーバは識別子として‘"’で囲まれた文字列を実行します。)
‘\’は文字列内のエスケープ文字です。
SQLステートメントで、db_name.tbl_name構文を使用して、さまざまなデータベース内のテーブルにアクセスできます。同様の機能備えたSQLサーバもありますが、これはUser
spaceと呼ばれます。MySQLサーバでは、以下のステートメントで使用されるようなテーブルスペースはサポートされていません。CREATE
TABLE ralph.my_table ... IN my_tablespace
SQLステートメント構文
ANALYZE TABLE、CHECK
TABLE、OPTIMIZE
TABLEそしてREPAIR
TABLEステートメント
CREATE DATABASE、DROP
DATABASEそしてALTER
DATABASE
ステートメント。項12.1.6. 「CREATE DATABASE 構文」、項12.1.12. 「DROP DATABASE 構文」、項12.1.1. 「ALTER DATABASE 構文」
などを参照してください。
DOステートメント
クエリオプティマイザによるテーブルの結合方法に関する説明を取得するEXPLAIN
SELECT。
FLUSHおよびRESETステートメント
SETステートメント項12.5.3. 「SET 構文」
を参照してください。
SHOWステートメント詳しくは
項12.5.4. 「SHOW 構文」
を参照してください。MySQL
5.0以降では、MySQL特有のSHOWステートメントの多くから得られた情報は、INFORMATION_SCHEMAクエリに対してSELECTを使用することで、より標準化されます。章 21. INFORMATION_SCHEMA データベース
を参照してください。
LOAD DATA
INFILEの使用。多くの場合、この構文はOracleのLOAD
DATA
INFILEと互換性があります。項12.2.5. 「LOAD DATA INFILE 構文」
を参照してください。
RENAME
TABLEの使用。項12.1.19. 「RENAME TABLE 構文」
を参照してください。
DELETE+INSERTの代わりとしてのREPLACE使用。項12.2.6. 「REPLACE 構文」
を参照してください。
ALTER
TABLEステートメントにおけるCHANGE
、col_nameDROP
、またはcol_nameDROP
INDEX、IGNOREまたはRENAMEの使用。ALTER
TABLEステートメントにおける、複数ADD、ALTER、DROP、またはCHANGE節の使用。項12.1.2. 「ALTER TABLE 構文」
を参照してください。
インデックス名、カラムのプリフィックス上のインデックス、およびCREATE
TABLEステートメントでのINDEXまたはKEYの使用。項12.1.8. 「CREATE TABLE 構文」
を参照してください。
CREATE
TABLEを用いたTEMPORARYまたはIF
NOT EXISTSの使用。
DROP TABLEおよびDROP
DATABASEを用いたIF
EXISTSの使用。
1つのDROP
TABLEステートメントで複数のテーブルを破棄することができます。
UPDATEおよびDELETEステートメントのORDER
BYおよびLIMIT節。
INSERT INTO 構文。
tbl_name SET
col_name =
...
INSERTおよびREPLACEステートメントのDELAYED節。
INSERT、REPLACE、DELETEおよびUPDATEステートメントのLOW_PRIORITY節。
SELECTステートメントにおけるINTO
OUTFILEまたはINTO
DUMPFILEの使用。項12.2.7. 「SELECT 構文」
を参照してください。
SELECTステートメントにおける、STRAIGHT_JOINもしくはSQL_SMALL_RESULTのようなオプション。
GROUP
BY節で、選択したすべてのカラムの名前を列挙する必要はありません。これにより、ごく一部ではありますが、きわめて一般的なクエリのパフォーマンスが向上します。項11.11. 「GROUP BY 句との関数および修飾子の使用」
を参照してください。
ORDER
BYを用いるだけでなくGROUP
BYを用いても、ASCおよびDESCを指定できます。
:=代入演算子を使用して、ステートメント内で変数を設定できます。
mysql>SELECT @a:=SUM(total),@b:=COUNT(*),@a/@b AS avg->FROM test_table;mysql>SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
データ型
MEDIUMINT、SETおよびENUMデータ型、そして様々なBLOBおよびTEXTデータ型。
AUTO_INCREMENT、BINARY、NULL、UNSIGNEDそしてZEROFILLデータ型の属性。
関数と演算子
他の SQL 環境を使用していたユーザにわかりやすいように、MySQL サーバでは多数の関数のエイリアスがサポートされています。たとえば、すべての文字列関数で、標準の SQL 構文と ODBC 構文の両方がサポートされています。
MySQL サーバでは、C
プログラミング言語のように、||
および &&
演算子が論理 OR および AND
を意味すると解釈されます。 MySQL
サーバでは、||と
OR、および&&
と AND
はシノニムです。このすぐれた構文のために、MySQL
サーバでは、文字列の連結に標準 SQLの
||
演算子を使用することができません。その代わりに、CONCAT()
を使用します。CONCAT()には引数をいくつでも使用できるので、||
演算子の使用を MySQL
サーバに変換するのは簡単です。
value_listに1つ以上の要素がある場合の、COUNT(DISTINCT
の使用。
value_list)
すべての文字列比較は、デフォルトでは大文字と小文字を区別せず、現在のキャラクタセット照合順序
で決められたソート順で行われます。このキャラクタセット照合順序は、デフォルトではlatin1(cp1252
West
European)です。これを変更するには、BINARY属性を指定してカラムを宣言するか、BINARY
キャストを使用して、字句順序よりもキャラクタコード値を使用して比較が行われるようにする必要があります。
%演算子はMOD()
のシノニムです。したがって、はN
%
MMOD(と同じです。N,M)%は、C
プログラマを対象として、また PostgreSQL
との互換性を確保するためにサポートされています。
=、<>、<=、<、>=、>、<<、>>、<=>、AND、OR、またはLIKE演算子を、SELECTステートメントのFROMの左側のカラム比較で使用することができます。例
:
mysql> SELECT col1=1 AND col2=2 FROM my_table;
LAST_INSERT_ID()関数は、最新のAUTO_INCREMENT値を返します。項11.10.3. 「情報関数」
を参照してください。
LIKEは数値上で許可されます。
REGEXPおよびNOT
REGEXP 拡張正規表現演算子。
1
つまたは複数の引数を使用するCONCAT()またはCHAR()。(MySQL
サーバでは、これらの関数は引数をいくつでも使用することができます。)
BIT_COUNT()、CASE、ELT()、FROM_DAYS()、
FORMAT()、IF()、PASSWORD()、ENCRYPT()、MD5()、ENCODE()、DECODE()、PERIOD_ADD()、PERIOD_DIFF()、TO_DAYS()またはWEEKDAY()関数。
部分文字列を削除するTRIM()の使用。標準SQLでは、1つの文字しか削除できない。
GROUP
BY関数STD()、BIT_OR()、BIT_AND()、BIT_XOR()、およびGROUP_CONCAT()。項11.11. 「GROUP BY 句との関数および修飾子の使用」
を参照してください。
優先順位に従って並べられた、新しい拡張機能が MySQL サーバに追加される時期を示す一覧については、http://dev.mysql.com/doc/mysql/en/roadmap.htmlにあるオンラインのMySQL開発ロードマップを参照してください。
