MySQL 5.1 リファレンスマニュアル :: 1 一般情報 :: 1.8 MySQLの標準への準拠 :: 1.8.4 SQL標準に対するMySQL拡張機能
« 1.8.3 ANSIモードでのMySQLの実行

1.8.5 MySQLと標準SQLとの違い »
Section Navigation      [Toggle]
  • 1.8 MySQLの標準への準拠
  • 1.8.1 MySQLが準拠する標準
  • 1.8.2 SQLモードの選択
  • 1.8.3 ANSIモードでのMySQLの実行
  • 1.8.4 SQL標準に対するMySQL拡張機能
  • 1.8.5 MySQLと標準SQLとの違い
  • 1.8.6 MySQL における制約の処理

1.8.4. SQL標準に対するMySQL拡張機能

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開発ロードマップを参照してください。

Copyright © 1997, 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices
Top / Previous / Next / Up / Table of Contents
© 2010, Oracle Corporation and/or its affiliates