MySQL Server は、ほかの SQL DBMS にはない拡張機能をサポートします。それらを使用した場合、ほかの SQL サーバーにコードを移植できなくなるため注意してください。場合によっては、MySQL 拡張機能を含むコードを記述しても、次の形式のコメントを使用することで移植することができます。
/*! MySQL-specific code */
この場合、MySQL Server は、ほかの SQL ステートメントのようにコメント内のコードを構文解析して実行しますが、ほかの SQL サーバーはその拡張機能を認識しません。たとえば、MySQL Server は次のステートメント内の STRAIGHT_JOIN
キーワードを認識しますが、ほかのサーバーは認識しません。
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
「!
」文字のあとにバージョン番号を追加すると、コメント内の構文は、MySQL のバージョンが指定されたバージョン番号以上の場合にだけ実行されます。次のコメント内の TEMPORARY
キーワードは MySQL 3.23.02 以降のサーバーでのみ実行されます。
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
次の説明は、MySQL 拡張機能をカテゴリでまとめた一覧です。
-
ディスク上のデータの構成
MySQL Server は、各データベースを MySQL データディレクトリ下のディレクトリにマップし、データベース内のテーブルをデータベースディレクトリ内のファイル名にマップします。これには、次のような意味があります。
ファイル名で大文字と小文字を区別するオペレーティングシステム (多くの Unix システムなど) 上の MySQL Server では、データベース名とテーブル名で大文字と小文字が区別されます。セクション9.2.2「識別子の大文字と小文字の区別」を参照してください。
標準的なシステムコマンドを使用して、
MyISAM
ストレージエンジンで管理されるテーブルのバックアップ、名前変更、移動、削除、およびコピーを行うことができます。たとえば、MyISAM
テーブルの名前変更を行うには、テーブルに対応する.MYD
、.MYI
、および.frm
ファイルの名前を変更します。(ただし、RENAME TABLE
やALTER TABLE ... RENAME
を使用して、サーバーにファイル名を変更させることをお勧めします。)
-
一般言語構文
デフォルトでは、「
'
」のほかに「"
」でも文字列を囲むことができます。ANSI_QUOTES
SQL モードが有効な場合、文字列を囲むことができるのは「'
」だけであり、サーバーは「"
」で囲まれた文字列を識別子と解釈します。「
\
」は文字列内のエスケープ文字です。SQL ステートメントでは、
db_name.tbl_name
構文を使用して、さまざまなデータベースのテーブルにアクセスできます。同様の機能を備えた SQL サーバーもありますが、これはUser space
と呼ばれます。MySQL Server は、CREATE TABLE ralph.my_table ... IN my_tablespace
など、ステートメントで使用されるようなテーブルスペースをサポートしません。
-
SQL ステートメント構文
ANALYZE TABLE
、CHECK TABLE
、OPTIMIZE TABLE
、およびREPAIR TABLE
ステートメント。CREATE DATABASE
、DROP DATABASE
、およびALTER DATABASE
ステートメント。セクション13.1.10「CREATE DATABASE 構文」、セクション13.1.21「DROP DATABASE 構文」、およびセクション13.1.1「ALTER DATABASE 構文」を参照してください。DO
ステートメント。クエリーオプティマイザによるテーブルの処理方法に関する説明を取得する
EXPLAIN SELECT
。FLUSH
およびRESET
ステートメント。SET
ステートメント。セクション13.7.4「SET 構文」を参照してください。SHOW
ステートメント。セクション13.7.5「SHOW 構文」を参照してください。MySQL 固有のSHOW
ステートメントの多くによって生成される情報は、SELECT
を使用してINFORMATION_SCHEMA
をクエリーすることによって、より標準的な方法で取得できます。第21章「INFORMATION_SCHEMA テーブル」を参照してください。LOAD DATA INFILE
の使用。多くの場合、この構文は Oracle のLOAD DATA INFILE
と互換性があります。セクション13.2.6「LOAD DATA INFILE 構文」を参照してください。RENAME TABLE
の使用。セクション13.1.32「RENAME TABLE 構文」を参照してください。DELETE
+INSERT
の代わりとしてのREPLACE
の使用。セクション13.2.8「REPLACE 構文」を参照してください。ALTER TABLE
ステートメントにおけるCHANGE
、col_name
DROP
、あるいはcol_name
DROP INDEX
、IGNORE
またはRENAME
の使用。ALTER TABLE
ステートメントにおける、複数のADD
、ALTER
、DROP
、またはCHANGE
句の使用。セクション13.1.7「ALTER TABLE 構文」を参照してください。インデックス名の使用、カラムのプリフィクス上のインデックス、および
CREATE TABLE
ステートメントでのINDEX
またはKEY
の使用。セクション13.1.17「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
SETcol_name
= ...INSERT
およびREPLACE
ステートメントのDELAYED
句。INSERT
、REPLACE
、DELETE
、およびUPDATE
ステートメントのLOW_PRIORITY
句。SELECT
ステートメントにおけるINTO OUTFILE
またはINTO DUMPFILE
の使用。セクション13.2.9「SELECT 構文」を参照してください。SELECT
ステートメントにおけるSTRAIGHT_JOIN
やSQL_SMALL_RESULT
などのオプション。GROUP BY
句で、選択したすべてのカラムの名前を列挙する必要はありません。これにより、ごく一部ではありますが、きわめて一般的なクエリーのパフォーマンスが向上します。セクション12.19「GROUP BY 句で使用される関数と修飾子」を参照してください。ORDER BY
を用いるだけでなくGROUP BY
を用いても、ASC
およびDESC
を指定できます。:=
割り当て演算子で、ステートメント内の変数を設定する機能。セクション9.4「ユーザー定義変数」を参照してください。
-
データ型
MEDIUMINT
、SET
、およびENUM
データ型と、さまざまなBLOB
およびTEXT
データ型。AUTO_INCREMENT
、BINARY
、NULL
、UNSIGNED
、およびZEROFILL
データ型の属性。
-
関数と演算子
ほかの SQL 環境を使用していたユーザーにわかりやすいように、MySQL Server では多数の関数のエイリアスがサポートされています。たとえば、すべての文字列関数で、標準の SQL 構文と ODBC 構文の両方がサポートされています。
MySQL Server は、
||
および&&
演算子が、C プログラミング言語の場合と同様に論理 OR および AND を意味することを理解しています。MySQL Server では、||
とOR
はシノニムであり、&&
とAND
も同様です。この優れた構文のために、MySQL Server では、文字列の連結に標準 SQL の||
演算子を使用することができません。その代わりに、CONCAT()
を使用します。CONCAT()
は任意の数の引数を取るため、||
演算子の使用を MySQL Server に変換することは簡単です。value_list
に複数の要素がある場合の、COUNT(DISTINCT
の使用。value_list
)文字列比較はデフォルトで、大文字と小文字が区別され、ソート順序は現在の文字セットの照合順序によって決定されます。デフォルトの文字セットは
latin1
(cp1252 西ヨーロッパ) です。これ以外を希望する場合は、BINARY
属性で自身のカラムを宣言するか、BINARY
キャストを使用する必要があります。これにより、辞書順ではなくベースとなる文字コード値を使用して比較が行われます。%
演算子はMOD()
のシノニムです。つまり、
はN
%M
MOD(
と同等です。N
,M
)%
は、C プログラマと、PostgreSQL との互換性のためにサポートされています。-
SELECT
ステートメントの出力カラムリスト (FROM
の左側) の式で、=
、<>
、<=
、<
、>=
、>
、<<
、>>
、<=>
、AND
、OR
、またはLIKE
演算子を使用できます。例:mysql> SELECT col1=1 AND col2=2 FROM my_table;
LAST_INSERT_ID()
関数は、最新のAUTO_INCREMENT
値を返します。セクション12.14「情報関数」を参照してください。LIKE
は、数値に対して使用できます。REGEXP
およびNOT REGEXP
拡張正規表現演算子。1 つまたは複数の引数を使用する
CONCAT()
またはCHAR()
。(MySQL Server では、これらの関数は引数をいくつでも使用することができます。)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()
。セクション12.19「GROUP BY 句で使用される関数と修飾子」を参照してください。