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_name
DROP
、またはcol_name
DROP
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
%
M
MOD(
と同じです。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開発ロードマップを参照してください。