Go to the first, previous, next, last section, table of contents.


MySQL 言語リファレンス

リテラル。文字列と数値をどのように書くか?

文字列

文字列は ' または " で括られます。

\ はエスケープ文字です。次のエスケープ文字が認識されます:

\0
ASCII 0 文字。
\n
改行文字。
\t
タブ文字。
\r
リターン文字。
\b
バックスペース文字。
\'
' 文字。
\"
" 文字。
\\
\ 文字。
\%
% 文字。これは % を検索するために、ワイルドカード文字列中 で使用されます。
\_
_ 文字。これは _ を検索するために、ワイルドカード文字列中 で使用されます。
' で始まる文字列中の ' は '' として書きます。
" で始まる文字列中の " は "" として書きます。

どのようにそれが働くかを示すいくつかの select の例。

MySQL> select 'hello', "'hello'", '""hello""', '''h''e''l''l''o''', "hel""lo";
1 rows in set (0.00 sec)

+-------+---------+-----------+-------------+--------+
| hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo |
+-------+---------+-----------+-------------+--------+
| hello | 'hello' | ""hello"" | 'h'e'l'l'o' | hel"lo |
+-------+---------+-----------+-------------+--------+
mysql> select 'hello', "hello", '""hello""', "'ello", 'e''l''lo', '\'hello';
1 rows in set (0.00 sec)

+-------+-------+-----------+-------+--------+--------+
| hello | hello | ""hello"" | 'ello | e'l'lo | 'hello |
+-------+-------+-----------+-------+--------+--------+
| hello | hello | ""hello"" | 'ello | e'l'lo | 'hello |
+-------+-------+-----------+-------+--------+--------+
mysql> select "This\nIs\nFour\nlines";
1 rows in set (0.00 sec)

+--------------------+
| This
Is
Four
lines |
+--------------------+
| This
Is
Four
lines |
+--------------------+

バイナリデータを BLOB に挿入したい場合、次の文字をエスケープシーケンスで 表す必要があります:

\0
ASCII 0。"\0"(バックスラッシュと数字 0)に置き換えます 。
\
ASCII 92, バックスラッシュ
'
ASCII 39, 引用符
"
ASCII 33, 二重引用符

' 内での "' 内での " はエスケープしては いけません。

C コードを書く場合、INSERT 節で文字をエスケープするために、C API 関数 mysql_escape_string(char *to,char *from,uint length) を使用 できます ('to' は少なくとも from より2倍大きいことに注意してください)。 perl では quote 関数を使用できます。

上記の特殊文字の一つを持つ可能性のある全ての文字列について、エスケープ関 数を実行すべきです!

数値

整数は数字の項目です。浮動小数点は . で小数を分割します。

正当な数値の例: 1221, 294.42, -32032.6809e+10

NULL

テキストファイル出力形式を使用する時、NULL\N として表 されます。 「LOAD DATA INFILE 構文」節参照

データベース, テーブル, インデックスそして項目の名前

データベース、テーブル、インデックスそして項目の名前は、MySQL では全て同じ規則に基づきます。

名前は、デフォルト文字セットのアルファベットと数字を使用します。これはデ フォルトでは ISO-8859-1 Latin1 ですが、MySQL コンパイル時に変更 できます。

MySQL は、何かが名前か数値かを決定できることが必要なため、次の 特殊な場合が発生します。

名前中に .@ のような記号文字は許されません。これらは MySQL の拡張で使用されるためです。

MySQL では次の構文のどれかで項目を参照できます:

'column' または 'table.column' を使用する場合、使用されたテーブルの間で 名前がユニークでなければエラーになります!

項目型

次の項目型がサポートされます:

Name Description Size
TINYINT[(M)] [UNSIGNED] [ZEROFILL] とても小さい整数。符号つきの範囲は -128~127。符号なしの範囲は 0~255。 1
SMALLINT[(M)]. [UNSIGNED] [ZEROFILL] 小さい整数。符号つきの範囲は -32768~32767。符号なしの範囲は 0~65535。 2
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 中間の整数。符号ありの範囲は -8388608~8388607。符号なしの範囲は 0~ 16777215。 3
INT[(M)] [UNSIGNED] [ZEROFILL] 通常の整数。符号ありの範囲は -2147483648~2147483647。符号なしの範囲は 0~ 4294967295。 4
BIGINT[(M)] [UNSIGNED] [ZEROFILL] 大きい整数。符号ありの範囲は -9223372036854775808~9223372036854775807。 符号なしの範囲は 0~18446744073709551615。全ての演算は符合付き BIGINT ま たは DOUBLE で行われるため、符合無しの 9223372036854775807 (63 bits) よ りも大きな整数をビット関数以外で使用すべきではありません! 8
FLOAT(Precision) 小さい浮動小数点数。Precision は 4 または 8 にできます。FLOAT(4) は単精 度数で、FLOAT(8) は倍精度数です (DOUBLE エントリを参照してください)。こ の構文は ODBC 互換です。範囲は -3.402823466E+38F~-1.175494351E-38, 0, -1.175494351E-38~3.402823466E+38F です。 4
FLOAT[(M,D)] 小さい浮動小数点数。符号なしにはできません。範囲は -3.402823466E+38F~ -1.175494351E-38, 0, -1.175494351E-38~3.402823466E+38F です。 4
DOUBLE PRECISION[(M,D)] 通常の浮動小数点数。符号なしにはできません。範囲は -1.7976931348623157E+308~-2.2250738585072014E-308, 0, 2.2250738585072014E-308~1.7976931348623157E+308 です。 8
REAL[(M,D)] DOUBLE と同じ 8
DECIMAL [(M,D)] 非パック浮動小数点数。符号なしにはできません。現在は double の最大範囲の 範囲です。CHAR 項目のように振舞います。 M+D
NUMERIC [(M,D)] DECIMAL と同じ M+D
TIMESTAMP [(M)] 自動的なタイムスタンプ。多くの TIMESTAMP 項目を持つ場合、最初の一つだけ が自動的になります。 4
DATE 日付情報を格納するための型。"YYYY-MM-DD" 構文を使用しますが、数値または 文字列で更新できます。少なくとも次の構文を理解します: 'YY-MM-DD', 'YYYY-MM-DD', 'YYMMDD' そして完全なタイムスタンプ (YYYYMMDDHHMMDD)。範囲は 0000-00-00 から 9999-12-31 です。 3
TIME 時刻情報を格納するための型。"HH:MM:SS" 構文を使用しますが、数値または文 字列で更新できます。少なくとも次の形式が理解できます: 'HH:MM:SS', 'HHMMSS', 'HHMM', 'HH'。 3
DATETIME 日付と時刻情報を格納するための型。形式 "YYYY-MM-DD HH:MM:SS"。8バイト使 用します。範囲は '0000-01-01 00:00:00'~'9999-12-31 23:59:59' です。 8
YEAR 年を格納するための型。形式 "YYYY" または "YY"。1バイト使用します。範囲は 0, 1901-2155 です。範囲 00-69 の2桁の年は 2000-2069 とみなされ、正しくソー トされます。(MySQL 3.22 の型) 1
CHAR(M) [binary] 固定長文字列。常に固有の長さまで空白が埋められます。範囲は 1~255 文字で す。終りの空白は読み出し時に削除されます。binary キーワードが与えられな い場合、ソートと比較はケースに依存しません。 M
VARCHAR(M) [binary] 可変長文字列。その長さで格納されます。全ての終わりの空白は格納時に削除さ れます。最大範囲は 1~255 文字です。binary キーワードが与えられない場合、 ソートと比較はケースに依存しません。 L+1
TINYTEXT and TINYBLOB 最大長 255 文字の TEXT/BLOB L+1
TEXT and BLOB 最大長 65535 文字の TEXT/BLOB L+2
MEDIUMTEXT and MEDIUMBLOB 最大長 16777216 文字の TEXT/BLOB L+3
LONGTEXT and LONGBLOB 最大長 4294967295 文字の TEXT/BLOB L+4
ENUM('value','value2',...) 文字列オブジェクト。許可された値セットの一つ(または NULL)のみ持つこと ができます。 「データ型についてさらに詳細」節参照 。 1 または 2
SET('value','value2',...) 文字列オブジェクト。許可された値セットの一つまたは複数の値を持つことがで きます。 「データ型についてさらに詳細」節参照 。 1-8

データ型についてさらに詳細

データベースサイズ情報

上のテーブルで L はインスタンスの実際の長さを、M は最大長を意味します。そして、 "abcd" の L+1 はデータベース内の 5 バイトを意味します。

長さフィールドが L のデータ型を使用した場合、可変長レコード形式を得ます。

数値型

全ての整数型はオプションの引数 unsigned を持つことができます。項目 で正の数値だけを許可したい時や、項目に少し大きな数値範囲を必要な時に、これ を使用できます。

また、全ての整数項目についてのオプションの引数 ZEROFILL は、項目は最 大長まで 0 で埋められることを意味します。

最大表示サイズと小数は、整形と最大項目幅の計算によります。

範囲外の整数値を格納した時、MySQL は最大(または最小)の可能な値 を格納します。ALTER TABLE または LOAD DATA INFILE 時、これ らの変換は '警告' として得られます。INSERT と UPDATE も警告を返せるよう にすることは TODO 上にあります。しかし、これは次のプロトコル変更にスケジュー ルされています。

例えば、-999999999999999 を int 項目に格納する時、値は -2147483648 となります。そして 99999999999999992147483647 となります。

そして、int が符号無しの場合、上の格納される値は 04294967296 になります。

同じ規則が全ての他の整数型にも適用されます。

割り当てられた領域を超える int(4) 項目のデータを返す時、MySQL は 9.99 を返します。オペレーションが UPDATE の場合は、警告が出さ れます。

decimal(4,2) のような型は、2桁の小数値を持った最大4文字を意味する ことに注意して下さい。これは -.99 -> 9.99 の範囲を与えます。

いくつかの丸めの問題を回避するために、MySQL は浮動小数点の項目に 格納する全てを常に、小数の数に一致するように丸めます。これは、 float(8,2) 内に格納される 2.3332.33 として格納 されることを意味します。

TIMESTAMP

1970年12月1日 00:00 から 2106年のいつかまでの範囲を持ち、1秒の精度です。 TIMESTAMP 項目は、NULL が設定されるか、ステートメント中で項目が更 新されなければ INSERTUPDATE ステートメントで自動的に更 新されます。インデックス(の一部)にできます。注意: 多くの timestamp 項目 が行にある場合は、最初の timestamp 項目だけが自動的に更新されます。任意 の timestamp 項目は NULL を設定すれば、現在の時刻に設定されます。 表示サイズに依存して、次の形式の一つが得られます: "YYYY-MM-DD HH:MM:SS", "YY-MM-DD HH:MM:SS", "YYYY-MM-DD" or "YY-MM-DD"。

TEXTBLOB

これらは上限無しの可変長を持つことができるオブジェクトです。全ての TEXT と BLOB オブジェクトはその長さ(オブジェクトの型に依存して 1 から 4 バイ ト)と共に格納されます。使用可能な TEXTBLOB の最大長は、 有効なメモリとクライアントバッファに依存します。TEXTBLOB の違いは、TEXT はケースに依存しないでソートと比較され、 BLOB はケースに依存して(文字コードで)比較されることだけです。 TEXT BLOB オブジェクトはインデックスにはできません。

BLOB はバイナリ巨大オブジェクト(binary large object)で、大きなデータを保 持できます。4種類の BLOB があります 「項目型」節参照 。通常、BLOB は制 限無しの VARCHAR と見なすことができます。

TEXT は、ソートと比較がケースに依存しない BLOB です。

BLOB/TEXT 項目はメッセージバッファより大きくできません。サー バとクライアントのメッセージバッファを変更する必要があることに注意してく ださい。 「MySQL のバッファサイズの変更方法」節参照 。

MyODBCBLOBLONGVARBINARY として、そして TEXTLONGVARCHAR として定義します。

BLOBTEXT 項目の制限:

  1. BLOB または TEXT はインデックスまたはインデックスの一部に はできません。
  2. BLOB または TEXT のソートまたはグループ時には、BLOB の最初 の max_sort_length (デフォルト 1024) だけが使用されます。この値は、 mysqld デーモン起動時に -O オプションで変更できます。 BLOB/TEXT を含んだ表現でグループできます: SELECT id,SUBSTR(blob,1,100) GROUP BY 2
  3. BLOBTEXT では、終りの空白は CHARVARCHAR のようにはカットされません。

ENUM

文字列オブジェクト。許可された値セットの一つだけを持つことができます。格 納される値はケース非依存です。存在しない値を格納しようとすると、"" が格 納されます。数値文脈で使用された場合は、このオブジェクトは値インデックス を返/格納します。有効な値が 255 個より少ない場合は、このオブジェクトは 1 バイト、そうでなければ 2バイト占有します (最大で 65535 個の異なる値)。整 数が ENUM に置かれた場合、最初が番号 1 として数えられる、対応する 文字列を得ることに注意して下さい (0 は間違った enum 値のために予約されて います)。ENUM 型でのソートは、enum 内の文字列の順によって行なわれ ます。NOT NULL と宣言された場合、デフォルト値は最初の値です。そう でなければデフォルト値は NULL です。

例えば、項目 test ENUM("one","two", "three") は次の値の任意を持つ ことができます:

NULL
"one"
"two"
"three"

SET

文字列オブジェクト。許可された値セットの一つまたは複数を持つことができま す。各値は ',' で区切られます。数値文脈で使われると、このオブジェクトは 使用された値のビット位置を返し/格納します。このオブジェクトは (異なる値 の数-1)/8+1 を 1,2,3,4 または 8 に丸めたバイトを占有します。64 個以上の 異なる値は持てません。整数が SET 内に置かれた場合、最初のビットが 最初の文字列に対応するように、対応する文字列が得られることに注意してくだ さい。SET 型でのソートは数値として行なわれます。

例えば、項目 test SET("one","two") NOT NULL は次の値を持つことが できます:

""
"one"
"two"
"one,two"

通常、LIKE または FINS_IN_SET() での、SET 項目の SELECT:

SELECT * from banner where banner_group LIKE '%value%';
SELECT * from banner where FIND_IN_SET('value',banner_group)>0;

しかし次も働きます:

SELECT * from banner where banner_group = 'v1,v2';  ;Exact match
SELECT * from banner where banner_group & 1;        ;Is in first group

正しい項目型の選択

最も精度の高い型を全ての場合に使用してみて下さい。例えば、1-99999 の整数 には、unsigned mediumint が最良の型です。

良くある問題は、貨幣の値の正確な表現です。MySQL では DECIMAL 型を使用すべきです。これは文字列として格納し、正確さのロ スは発生しません。正確さが重要でない場合は DOUBLE 型でも十分良い です。

高精度のため、常に BITINT に格納される固定小数点型に変換できます。 これは、全ての計算を整数で行なうようにし、結果だけを浮動小数点に変換して 戻します。

行形式の種類は? また VARCHAR/CHAR の使用時は?」節参照 .

項目インデックス

BLOBTEXT 型を除く MySQL の全ての項目はインデッ クスを持つことができます。適切な項目でのインデックスの使用は、select の 性能を向上する最良の方法です。

CHARVARCHAR 項目には接頭部にインデックスを持つことができ ます。次の例は、項目の最初の 10 文字にインデックスを作成する方法を示します。 これは項目全体にインデックスを持つのに比べ、とても速く、そしてより少ないディ スク領域が必要です。

CREATE TABLE test (
name CHAR(200) NOT NULL,
KEY index_name (name(10));

複数項目インデックス

MySQL は異なる項目のセットに一つのインデックスを持つことができま す。

複数項目インデックスは、項目が連結され、ソートされた配列と見なすことがで きます。これは、インデックス内の最初の項目が知られた量で、他の項目がそうで ない場合に、クエリが速くなります。

次のテーブルを持っていると仮定します:

CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name));

インデックス name は last_name と first_name にまたがったインデッ クスです。

name インデックスは次のクエリで使用されます:

SELECT * FROM test WHERE last_name="Widenius";

SELECT * FROM test WHERE last_name="Widenius" AND first_name="Michael";

SELECT * FROM test WHERE last_name="Widenius" AND
                         (first_name="Michael" OR first_name="Monty");

SELECT * FROM test WHERE last_name="Widenius" and
                         first_name >="M" and first_name < "N";

name インデックスは次のクエリでは使用されません:

SELECT * FROM test WHERE first_name="Michael";

SELECT * FROM test WHERE last_name="Widenius" or first_name="Michael";

異なるデータベースエンジンとの間でテーブル定義を簡単に移植するための型対応

他の SQL ベンダからのコードの使用をより簡単にサポートするため、 MySQL は次の対応をサポートします:

binary(num) char(num) binary
char varying varchar
float4 float
float8 double
int1 tinyint
int2 smallint
int3 mediumint
int4 int
int8 bigint
long varbinary blob
long varchar text
middleint mediumint
varbinary(num) varchar(num) binary

SELECTWHERE 節で使用する関数

select_expression または where_definition は次の関数を使用 した任意の表現からなります:

次の例では、mysql プログラムの出力は短くなっています。つまり:

mysql> select mod(29,9);
1 rows in set (0.00 sec)

+-----------+
| mod(29,9) |
+-----------+
|         2 |
+-----------+

これは次に変換されています:

mysql> select mod(29,9);                ->      2

グループ化関数

(
)
括弧。表現の評価の順を強制します。
mysql> select 1+2*3;                     ->      7
mysql> select (1+2)*3;                   ->      9

通常の算術演算

+
加算
-
減算。
*
乗算
/
除算。0 割りは NULL を返します。
mysql> select 102/(1-1);                 ->      NULL

ビット関数

これらは最大 64 ビットの範囲を持ちます。MySQL は bigint (64 bit) 演算を使用するためです。

|
ビット演算 OR。
mysql> select 29 | 15;                   ->     31
&
ビット演算 AND。
mysql> select 29 & 15;                   ->      13
BIT_COUNT()
引数のセットされているビットの数。
mysql> select bit_count(29);             ->      4

論理演算

全ての論理関数は 1 (TRUE) または 0 (FALSE) を返します。

NOT
!
論理否定。引数が 0 なら 1 を返し、そうでなければ 0 を返します。
mysql> select NOT 1;                    ->      0
mysql> select NOT NULL;                 ->      NULL
mysql> select ! (1+1);                  ->      0
mysql> select ! 1+1;                    ->      1
OR
||
論理和。引数のどれかが 0 または NULL でなければ 1 を返します。
mysql> select 1 || 0;                   ->      1
mysql> select 0 || 0;                   ->      0
mysql> select 1 || NULL;                ->      1

AND
&&
論理積。全ての引数が 0 または NULL でなければ 1 を返します。
mysql> select 1 && NULL;                ->      0
mysql> select 1 && 0;                   ->      0

比較演算子

1 (TRUE), 0 (FALSE) または NULL を返します。これらの関数は数値と 文字列の両方で働きます。MySQL は比較がどのように行なわれるかを 決定するために、次の規則を使用します:

どちらかまたは両方の引数が NULL の場合は、比較結果は NULL です。

=
等しい。
mysql> select 1 = 0;                    ->      0
mysql> select '0' = 0;                  ->      1
mysql> select '0.0' = 0;                ->      1
mysql> select '0.01' = 0;               ->      0
mysql> select '.01' = 0.01;             ->      1
<>
!=
等しくない。
mysql> select '.01' <> '0.01';          ->      1
mysql> select .01 <> '0.01';            ->      0
mysql> select 'zapp' <> 'zappp';        ->      1
<=
より小さいまたは等しい。
mysql> select 0.1 <= 2;                 ->      1
<
より小さい。
mysql> select 2 <= 2;                   ->      1
>=
より大きいまたは等しい。
mysql> select 2 >= 2;                   ->      1
>
より大きい。
mysql> select 2 > 2;                    ->      0
ISNULL(A)
ANULL なら 1 を、そうでなければ 0 を返します。
mysql> select isnull(1+1);              ->      0
mysql> select isnull(1/0);              ->      1
A BETWEEN B AND C
AB 以上かつ AC 以下。全ての引数が同 じ型の場合、(A >= B AND A <= C) と同じです。比較がどのように行な われるかを決定するのは最初の引数 (A) です! A が文字列表現 の場合、ケース非依存文字列として比較されます。A がバイナリ文字列 の場合、バイナリ文字列として比較されます。A が正数表現の場合、正 数として検索されます。そうでなければ実数として比較されます。
mysql> select 1 between 2 and 3;        ->      0
mysql> select 'b' between 'a' and 'c';  ->      1
mysql> select 2 between 2 and '3';      ->      1
mysql> select 2 between 2 and 'x-3';    ->      0

文字列比較関数

expr IN (value,...)
expr が IN リスト中の値のどれかなら 1 を返し、そうでなければ 0 を 返します。全ての値が定数の場合は、全ての値は expr の型に従って評価、ソー トされます。項目の検索はバイナリ検索の使用によって行なわれます。これは、 IN 部内に定数が使用された場合に IN はとても速いことを意味 します。
mysql> select 2 in (0,3,5,'wefwf');               ->      0
mysql> select 'wefwf' in (0,3,5,'wefwf');         ->      1
expr NOT IN (value,...)
NOT (expr IN (value,...)) と同じ
expr LIKE expr
SQL の簡単な正規表現比較です。1 (TRUE) または 0 (FALSE) を返します。 LIKE には2つのワイルドカードがあります。
% 任意の数の文字(0文字も含む)に適合します。
_ 厳密に1つの文字に適合します。
\% 1つの % に適合します。
\_ 1つの _ に適合します。
mysql> select 'David!' like 'David_';             ->      1
mysql> select 'David!' like 'David\_';            ->      0
mysql> select 'David_' like 'David\_';            ->      1
mysql> select 'David!' like '%D%v%';              ->      1
mysql> select 10 like '1%';                       ->      1
LIKE は数値表現でも許されます!(拡張)
  • expr NOT LIKE expr NOT (expr LIKE expr) と同じです。
  • expr REGEXP expr
  • expr RLIKE expr 拡張正規表現に基づいて文字列をチェックします。 「MySQL 正規表現構文の解説」節参照 . RLIKEmSQL 互換のためです。注意: MySQL は文字列中で C エスケープ構文 (\n) を使用するため、 REGEXP 文字列内で使用する '\' は二重にする必要があります。
    mysql> select 'Monty!' regexp 'm%y%%';            ->      0
    mysql> select 'Monty!' regexp '.*';               ->      1
    mysql> select 'new*\n*line' regexp 'new\\*.\\*line'
    
  • expr NOT REGEXP expr NOT (expr REGEXP expr) と同じ。
  • STRCMP() 文字列が同じなら 0 を返します。そうでなければ、最初の引数がソート順で小 さければ -1 を返します。そうでなければ 1 を返します。
    mysql> select strcmp('text', 'text2');            -> -1
    mysql> select strcmp('text2', 'text');            -> 1
    mysql> select strcmp('text', 'text');             -> 0
    
  • フロー制御関数

    IFNULL(A,B)
    ANULL でない場合は A を、そうでなければ B を返します。
    mysql> select ifnull(1,0);        -> 1
    mysql> select ifnull(0,10);       -> 0
    mysql> select ifnull(1/0,10);     -> 10
    
    IF(A,B,C)
    A が真 (A <> 0 かつ A <> NULL) の場合 B を返 し、そうでなければ C を返します。A は INTEGER として評価されます。 これは浮動小数点を使用する場合、比較演算も使用すべきであることを意味しま す。
    mysql> select if(1>2,2,3);        -> 3
    

    数学関数

    すべての数学関数はエラーの場合 NULL を返します。

    -
    符号。引数の符号を変更します。
    mysql> select - 2;                -> -2
    
    ABS()
    絶対値。
    mysql> select abs(2);             -> 2
    mysql> select abs(-32);           -> 32
    
    SIGN()
    引数の符号。-1, 0 または 1 を返します。
    mysql> select sign(-32);          -> -1
    mysql> select sign(0);            -> 0
    mysql> select sign(234);          -> 1
    
    MOD()
    %
    剰余 (C の % と同様)。
    mysql> select mod(234, 10);       -> 4
    mysql> select 253 % 7;            -> 1
    mysql> select mod(29,9);                -> 2
    
    FLOOR()
    x より小さい最大の整数値。
    mysql> select floor(1.23);              -> 1
    mysql> select floor(-1.23);             -> -2
    
    CEILING()
    x より大きい最小の整数値。
    mysql> select ceiling(1.23);            -> 2
    mysql> select ceiling(-1.23);           -> -1
    
    ROUND(N)
    引数 N を整数に丸めます。
    mysql> select round(-1.23);             -> -1
    mysql> select round(-1.58);             -> -2
    mysql> select round(1.58);              -> 2
    
    ROUND(Number,Decimals)
    引数 NumberDecimals 桁の少数に丸めます。
    mysql> select ROUND(1.298, 1);          -> 1.3
    
    EXP(N)
    e (自然対数の基数) の N 乗の値を返します。
    mysql> select exp(2);                   -> 7.389056
    mysql> select exp(-2);                  -> 0.135335
    
    LOG(X)
    X の自然対数を返します。
    mysql> select log(2);             -> 0.693147
    mysql> select log(-2);            -> NULL
    
    LOG10(X)
    X の 10基数の対数を返します。
    mysql> select log10(2);           -> 0.301030
    mysql> select log10(100);                 -> 2.000000
    mysql> select log10(-100);                -> NULL
    
    POW(X,Y)
    POWER(X,Y)
    XY 乗の値を返します。
    mysql> select pow(2,2);           -> 4.000000
    mysql> select pow(2,-2);                  -> 0.250000
    
    sqrt(X)
    X の非負の平方根を返します。
    mysql> select sqrt(4);            -> 2.000000
    mysql> select sqrt(20);           -> 4.472136
    
    PI()
    PI の値を返します。
    mysql> select PI();               -> 3.141593
    
    COS(X)
    X のコサインを返します。X はラジアンで与えられます。
    mysql> select cos(PI());                  -> -1.000000
    
    SIN(X)
    X のサインを返します。X はラジアンで与えられます。
    mysql> select sin(PI());                  -> 0.000000
    
    TAN(X)
    X のタンジェントを返します。X はラジアンで与えられます。
    mysql> select tan(PI()+1);                -> 1.557408
    
    ACOS(X)
    Return the arc cosine of X; that is the value whose cosine is X. If X is not in the range -1 to 1 NULL is returned.
    mysql> select ACOS(1);                  -> 0.000000
    mysql> select ACOS(1.0001);             -> NULL
    mysql> select ACOS(0);          -> 1.570796
    
    ASIN(X)
    X のアークサインを返します。すなわちサインが X になる値で す。X が -1 から 1 の範囲にない場合 NULL が返されます。
    mysql> select ASIN(0.2);                -> 0.201358
    mysql> select ASIN('foo');              -> 0.000000
    
    ATAN(X)
    X のアークタンジェントを返します。すなわちタンジェントが X になる値です。
    mysql> select ATAN(2);          -> 1.107149
    mysql> select ATAN(-2);         -> -1.107149
    
    ATAN2(X,Y)
    2つの値 XY のアークタンジェントを返します。Y / X のアークタンジェントの計算と同様ですが、両方の引数の符号が結果の quadrant を決定するために使用されます。
    mysql> select ATAN(-2,2);               -> -0.785398
    mysql> select ATAN(PI(),0);             -> 1.570796
    
    COT(N)
    N のコタンジェントを返します。
    mysql> select COT(12);          -> -1.57267341
    mysql> select COT(0);           -> NULL
    
    RAND([X])
    浮動小数点の乱数 0 <= x <= 1.0 を返します。正数表現 X はオ プションでシード値として使用されます。
    mysql> SELECT RAND();           -> 0.5925
    mysql> SELECT RAND(20);         -> 0.1811
    mysql> SELECT RAND(20);         -> 0.1811
    mysql> SELECT RAND();           -> 0.2079
    mysql> SELECT RAND();           -> 0.7888
    
    RAND() 値を持つ項目は ORDER BY できません。ORDER BY は項目を複数回評価す るためです。
    MIN(X,Y...)
    引数の最小値。2個以上の引数が必要です。でなければ、これは GROUP BY 関数です。引数は数値として比較されます。レコードが見つからない場合は NULL が返されます。
    mysql> SELECT MIN(2,0);                         -> 0
    mysql> SELECT MIN(34,3,5,767);                  -> 3
    mysql> SELECT MIN(a) from table where 1=0;      -> NULL
    
    MAX(X,Y...)
    引数の最大値。2個以上の引数が必要です。でなければ、これは GROUP BY 関数です。引数は数値として比較されます。レコードが見つからない場合は NULL が返されます。
    mysql> SELECT MAX(34,3,5,767);                  -> 767
    mysql> SELECT MAX(2,0,4,5,34);                  -> 34
    mysql> SELECT MAX(a) from table where 1=0;      -> NULL
    
    DEGREES(N)
    ラジアンから度に変換された N を返します。
    mysql> select DEGREES(PI());                    -> 180.000000
    
    RADIANS(N)
    度からラジアンに変換された N を返します。
    mysql> select RADIANS(90);                      -> 1.570796
    
    TRUNCATE(Number, Decimals)
    NumberDecimals 桁の少数に切り捨てます。
    mysql> select TRUNCATE(1.223,1);                -> 1.2
    mysql> select TRUNCATE(1.999,1);                -> 1.9
    mysql> select TRUNCATE(1.999,0);                -> 1
    

    文字列関数

    ASCII(S)
    S の左端の文字の ASCII コード値を返します。SNULL の場合は NULL を返します。
    mysql> SELECT ascii(2);                         -> 50
    mysql> SELECT ascii('dx');                      -> 100
    
    CHAR(X,...)
    引数の ASCII コード値によって与えられた文字からなる文字列を返します。 NULL は飛ばされます。
    mysql> SELECT char(77,121,83,81,'76');          -> 'MySQL'
    
    CONCAT(X,Y...)
    文字列を結合します。2個以上の引数を必要とします。
    mysql> SELECT CONCAT('My', 'S', 'QL');          -> 'MySQL'
    
    LENGTH(S)
    OCTET_LENGTH(S)
    CHAR_LENGTH(S)
    CHARACTER_LENGTH(S)
    文字列の長さ。
    mysql> SELECT length('text');                   -> 4
    mysql> SELECT octet_length('text');             -> 4
    
    LOCATE(A,B)
    POSITION(B IN A)
    B 内にある A 文字列の位置を返します。最初の位置は 1 です。 B 内に A がない時は 0 を返します。
    mysql> select locate('bar', 'foobarbar');         -> 4
    mysql> select locate('xbar', 'foobar');           -> 0
    
    INSTR(A,B)
    文字列 A 内の最初の文字列 B の位置を返します。これは引数を 交換した LOCATE と同じです。
    mysql> select instr('foobarbar', 'bar');         -> 4
    mysql> select instr('xbar', 'foobar');           -> 0
    
    LOCATE(A,B,C)
    文字列 BC 位置から、文字列 A の位置を返します。
    mysql> select locate('bar', 'foobarbar',5);        -> 7
    
    LEFT(str,length)
    文字列の最初から length 個の文字を得ます。
    mysql> select left('foobarbar', 5);             -> 'fooba'
    
    RIGHT(A,B)
    SUBSTRING(A FROM B)
    文字列 A の最後から B 個の文字を得ます。
    mysql> select right('foobarbar', 5);            -> 'arbar'
    mysql> select substring('foobarbar' from 5);    -> 'arbar'
    
    LTRIM(str)
    文字列の最初から空白文字を削除します。
    mysql> select ltrim('  barbar');                -> 'barbar'
    
    RTRIM(str)
    文字列の最後から空白文字を削除します。
    mysql> select rtrim('barbar   ');             -> 'barbar'
    
    TRIM([[ BOTH | LEADING | TRAILING] [ A ] FROM ] B)
    全ての A プレフィックスまたはサフィックスを B から削除した 文字列を返します。BOTH, LEADING そして TRAILING が 使用されない場合、BOTH が適用されます。A が与えられないと、 空白が削除されます。
    mysql> select trim('  bar   ');                      -> 'bar'
    mysql> select trim(leading 'x' from 'xxxbarxxx');    -> 'barxxx'
    mysql> select trim(both 'x' from 'xxxbarxxx');       -> 'bar'
    mysql> select trim(trailing 'xyz' from 'barxxyz');   -> 'barx'
    
    SOUNDEX(S)
    Gets a soundex string from S. Two strings that sound 'about the same' should have identical soundex strings. A 'standard' soundex string is 4 characters long, but this function returns an arbitrary long string. One can use SUBSTRING on the result to get a 'standard' soundex string. All non alpha characters are ignored in the given string. All characters outside the A-Z range are treated as vocals.
    mysql> select soundex('Hello');                 -> 'H400'
    mysql> select soundex('B-A�ttre');                -> 'B360'$)B
    mysql> select soundex('Quadratically');         -> 'Q36324'
    
    SUBSTRING(A, B, C)
    SUBSTRING(A FROM B FOR C)
    MID(A, B, C)
    AB 位置から C 文字の文字列を返します。 FROM の違いは ANSI SQL 92 構文です。
    mysql> select substring('Quadratically',5,6);          -> ratica
    
    SUBSTRING_INDEX(String, Delimiter, Count)
    String から、DelimiterCount 個に区切られた文字 列を返します。Count が正の場合は文字列は左から検索され、 Count が負の場合は文字列は右から検索されます。
    mysql> select substring_index('www.tcx.se', '.', 2);   -> 'www.tcx'
    mysql> select substring_index('www.tcx.se', '.', -2);  -> 'tcx.se'
    
    SPACE(N)
    N 個の空白文字を返します。
    mysql> select SPACE(6);         -> '      '
    
    REPLACE(A, B, C)
    文字列 A 内の全ての文字列 BC に置き換えます。
    mysql> select replace('www.tcx.se', 'w', 'Ww');  -> 'WwWwWw.tcx.se'
    
    REPEAT(String, Count)
    StringCount 回繰り返します。Count <= 0 の場合は 空の文字列を返します。String または CountNULL または、LENGTH(string)*count > max_allowed_size の場合は NULL を返します。
    mysql> select repeat('MySQL', 3);                -> 'MySQLMySQLMySQL'
    
    REVERSE(String)
    文字列中の全ての文字を反転します。
    mysql> select reverse('abc');  -> 'cba'
    
    INSERT(Org, Start, Length, New)
    Org 中の Start 位置から Length 長の文字列を New で置き換えます。Org 内の最初の位置は1です。
    mysql> select insert('Quadratic', 3, 4, 'What');   -> 'QuWhattic'
    
    INTERVAL(N, N1, N2, N3...)
    この関数が機能するためには Nn > N3 > N2 > N1 が要求されます。これは(とても速い)バイナリサーチが使用されるからです。 N < N1 の場合は 0 を、N < N2 の場合は 1 を (以後同様…)返します。全ての引数は数値としてテストされます。
    mysql> select INTERVAL(23, 1, 15, 17, 30, 44, 200);     -> 3
    mysql> select INTERVAL(10, 1, 10, 100, 1000);           -> 2
    mysql> select INTERVAL(22, 23, 30, 44, 200);            -> 0
    
    ELT(N, A1, A2, A3...)
    N = 1 なら A1 を、N = 2 なら A2 を返します。 N が 1 より小さい場合、または引数の数より大きい場合は NULL が返されます。
    mysql> select elt(1, 'ej', 'Heja', 'hej', 'foo');  -> 'ej'
    mysql> select elt(4, 'ej', 'Heja', 'hej', 'foo');  -> 'foo'
    
    FIELD(S, S1, S2, S3...)
    S1, S2, S3... リスト内の S のインデックスを 返します。ELT() の逆です。S が見つからなければ 0 を返します。
    mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');       -> 2
    mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');       -> 0
    
    FIND_IN_SET(string,string of strings)
    'string' が 'string of strings' 中にあれば、値 1 から N を返します。'string of strings' は、それぞれの異なる値が ',' で分割された文字列です。最初の 引数が定数文字列で2番目が SET 型の項目の場合、FIND_IN_SET はビット演算 を使用して最適化されます!
    mysql> SELECT FIND_IN_SET('b','a,b,c,d')		-> 2
    
    最初の引数が ',' を含む場合は、この関数は当然働きません。
    LCASE(A)
    LOWER(A)
    A を現在の文字セット,dmappings (デフォルト Latin1) にしたがって小 文字に変換します。
    mysql> select lcase('QUADRATICALLY');           -> 'quadratically'
    
    UCASE(A)
    UPPER(A)
    A を大文字に変換します。
    mysql> select ucase('Hej');             -> 'HEJ'
    

    日付と時刻関数

    1つ以上の日付関数を使用する例:

    date_field が最新の30日である全てのレコードを選択します。

    SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_field) <= 30;
    

    Date 表現は date 文字列、datetime 文字列、timestamp([6 | 8 | 14]) または、YYMMDDYYYYMMDD の形式の数値です。

    date 表現では、年は 2 または 4 桁の数値です。2 桁は 1970-2069 の範囲と見 なされます。Date 100-199 は年の演算をより簡単にするため、2000-2999 に変 換されます! 特殊な日付 '0000-00-00' は 0000-00-00 として格納され、取り 出されます。

    数値に日付関数を使用する場合、数値の長さが 4, 8 または >= 14 なら年が4桁 と見なされます。他の全てのケースでは年は与えられた数値の最初の2桁と見な されます。安全側におくため、日付を数値(文字列でなく)で使用する時は、常に 4桁の日付を使用すべきです! そうでなければ、2000年で問題が発生します。数 値 002001 が日付関数に送られた時、日付 '20002001' の代わりに '2001' にな ります。'002001' はもちろん正しく働きます!

    Time 表現は date 文字列、datetime 文字列、timestamp([6 | 8 | 14]) または、HHMMSSYYYYMMDDHHMMSS 形式の数値です。

    DAYOFWEEK(date expr)
    Date の曜日を得ます (0 = 日曜日, 1 = 月曜日, 2 = 火曜日 ..) これは ODBC 標準に従います。
    mysql> select dayofweek('1998-02-03');		-> 3
    
    WEEKDAY(date expr)
    Date の曜日を得ます (0 = 月曜日, 1 = 火曜日 ..)
    mysql> select WEEKDAY('1997-10-04 22:23:00');	-> 5
    mysql> select WEEKDAY('1997-11-05');            -> 2
    
    DAYOFMONTH(date expr)
    月の日を返します (1-31)
    mysql> select DAYOFMONTH('1998-02-03');		-> 3
    
    DAYOFYEAR(date expr)
    年の日を返します (1-366)
    mysql> select DAYOFYEAR('1998-02-03');		-> 34
    
    MONTH(date expr)
    月を返します (1-12)
    mysql> select MONTH('1998-02-03');		-> 02
    
    DAYNAME(date expr)
    曜日の名前を返します。
    mysql> select dayname("1998-02-05");            -> Thursday
    
    MONTHNAME(date expr)
    月の名前を返します。
    mysql> select monthname("1998-02-05");          -> February
    
    QUARTER(date expr)
    Returns quarter (1-4).
    mysql> select QUARTER('98-04-01');		-> 2
    
    WEEK(date expr)
    日曜日が年の最初の日である位置上の週を返します (1-53)。
    mysql> select WEEK('98-02-20');			-> 7
    
    YEAR(date expr)
    年を返します (1000-9999)。
    mysql> select YEAR('98-02-03');			-> 1998
    
    HOUR(time expr)
    時を返します (0-23)
    mysql> select HOUR('10:05:03');			-> 10
    
    MINUTE(time expr)
    分を返します (0-59)。
    mysql> select MINUTE('98-02-03 10:05:03');	-> 5
    
    SECOND(time expr)
    秒を返します (1000-9999)。
    mysql> select SECOND('10:05:03');		-> 3
    
    PERIOD_ADD(P, N)
    N 月を期間 P (型 YYMM または YYYYMM) に追加 します。YYYYMM を返します。
    mysql> select PERIOD_ADD(9801,2);               -> 199803
    
    PERIOD_DIFF(A, B)
    期間 AB の差の月を返します。AB は形 式 YYMM または YYYYMM です。
    mysql> select PERIOD_DIFF(9802,199703);         -> 11
    
    TO_DAYS(Date)
    Date を daynumber (0年からの日数) に変換します。DateDATE 文字列、DATETIME 文字列、TIMESTAMP([6 | 8 | 14])YYMMDD または YYYYMMDD 形式の数値です。
    mysql> select TO_DAYS(9505);                    -> 733364
    mysql> select TO_DAYS('1997-10-07);             -> 729669
    
    FROM_DAYS()
    daynumber を DATE に変換します。
    mysql> select from_days(729669);                -> 1997-10-07       
    
    DATE_FORMAT(Date, Format)
    Format 文字列にしたがって Date (date または timestamp) を 整形します。次の整形コマンドが知られています:
    M 月名
    W 曜日
    D 英語サフィックス付き月の日
    Y 4桁の年
    y 2桁の年
    a 省略された曜日名 (Sun..Sat)
    d 月の日, 数値
    m 月, 数値
    b 省略された月名 (Jan.Dec)
    j 年の日 (001..366)
    H 時 (00..23)
    k 時 ( 0..23)
    h 時 (01..12)
    I 時 (01..12)
    l 時 ( 1..12)
    i 分, 数値
    r 時刻, 12時間 (hh:mm:ss [AP]M)
    T 時刻, 24時間 (hh:mm:ss)
    S 秒 (00..59)
    s 秒 (00..59)
    p AM または PM
    w 週の日 (0=日曜日..)
    % 一つの % は無視されます。% のためには %% を使用してください (将来の拡張のため)。
    他の全ての文字は結果にコピーされます。
    mysql> select date_format('1997-10-04 22:23:00', '%W %M %Y %h:%i:%s');
            -> 'Saturday October 1997 22:23:00'
    mysql> select date_format('1997-10-04 22:23:00', '%D %y %a %d %m %b %j %H %k %I %r %T %S %w');
            -> '4th 97 Sat 04 10 Oct 277 22 22 10 10:23:00 PM 22:23:00 00 6'
    
    しばらくは % はオプションです。MySQL の将来のバージョン では、% は必要となります。
  • TIME_FORMAT(time expr, format) これは上記の DATE_FORMAT のように使用されますが、format オプションでは、 時,分,秒だけを操作できます。他のオプションは NULL 値または 0 を与えます。
  • WEEKDAY(Date) DATE の曜日を得ます (0 = 月曜日, 1 = 火曜日)。Date は date 文字列、datetime 文字列、timestamp([6 | 8 | 14])、YYMMDD または YYYYMMDD 形式の数値です。
    mysql> select WEEKDAY('1997-10-04 22:23:00');           -> 5
    mysql> select WEEKDAY('1997-11-05');                    -> 2
    
  • CURDATE()
  • CURRENT_DATE 今日の日付を返します。形式は、CURDATE() が数値または文字列のどち らの文脈で使用されたかに依存して YYYYMMDD または 'YYYY-MM-DD' です。
    mysql> select CURDATE();                -> '1997-12-15'
    mysql> select CURDATE()+0;              -> 19971215
    
  • CURTIME()
  • CURRENT_TIME 現在の時刻を HHMMSS または 'HH:MM:SS' の形式で返します。こ れは CURTIME() が数値または文字列のどちらの文脈で使用されたかに依 存します。
    mysql> select CURTIME();                -> '23:50:20'
    mysql> select CURTIME()+0;              -> 235026
    
  • NOW()
  • SYSDATE()
  • CURRENT_TIMESTAMP 現在の時刻を返します。形式は、NOW() が数値または文字列のどちらの 文脈で使用されたかに依存して YYYYMMDDHHMMSS または 'YYYY-MM-DD HH:MM:SS' です。
    mysql> select NOW();            -> '1997-12-15 23:51:26'
    mysql> select NOW()+0;          -> 19971215235131
    
  • UNIX_TIMESTAMP([date expression]) 引数なしで呼び出された場合は、UNIX timestamp (GMT 1970.01.01 00:00:00 か らの秒数) です。通常は、TIMESTAMP 項目を引数として呼び出し、項目 値を秒数で返します。Date はローカル時刻での date 文字列、datetime 文字列、または YYMMDD または YYYYMMDD 形式の数値です。
    mysql> select UNIX_TIMESTAMP();                         -> 882226357
    mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');    -> 875996580
    
  • FROM_UNIXTIME(Unix_timestamp) 文脈(数値/文字列)に依存して、YYYY-MM-DD HH:MM:SS または YYYYMMDDHHMMSS 形式の timestamp 文字列を返します。
    mysql> select FROM_UNIXTIME(875996580);   -> '1997-10-04 22:23:00'
    
  • FROM_UNIXTIME(Unix_timestamp, Format_string) Format_string に従って整形された timestamp 文字列を返します。整形文字列 は次を含みます:
    M 月, 文字列
    W 日 (週の), 文字列
    D 日 (月の), 数値+英語サフィックス
    Y 年, 数値, 4 桁
    y 年, 数値, 2 桁
    m 月, 数値
    d 日 (月の), 数値
    h 時, 数値
    i 分, 数値
    s 秒, 数値
    w 日 (週の), 数値
    その他 他の文字はそのままコピーされます。
    mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(), 'Y D M h:m:s x');
            -> '1997 23rd December 03:12:30 x'
    
  • SEC_TO_TIME(Seconds) 文脈に依存して H:MM:SS または HMMSS 形式で、引数の時, 分, 秒を返します。
    mysql> select SEC_TO_TIME(2378);                -> '00:39:38'
    mysql> select SEC_TO_TIME(2378)+0;              -> 3938
    
  • TIME_TO_SEC(Time) Time を秒に変換します。
    mysql> select TIME_TO_SEC('22:23:00');  -> 80580
    mysql> select TIME_TO_SEC('00:39:38');  -> 2378
    
  • その他の関数

    DATABASE()
    現在のデータベース名を返します。
    mysql> select DATABASE();               -> 'test'
    
    USER()
    SYSTEM_USER()
    SESSION_USER()
    現在のユーザ名を返します。
    mysql> select USER();                   -> 'davida'
    
    PASSWORD(String)
    プレーンテキストのパスワード String からパスワード文字列を計算し ます。パスワードを 'user' 承認テーブル内に格納するために使用する必要があ ります。
    mysql> select PASSWORD('badpwd');       -> '7f84554057dd964b'
    
    ENCRYPT(String[, Salt])
    UNIX の crypt() コマンドで String を暗号化します。 Salt は2文字の文字列です。crypt() が見使わない場合は常に NULL が返されます。
    
    
    
    
    LAST_INSERT_ID()
    最後に auto_increment 項目に設定された自動的に生成された値を返します。 「最後に挿入された行のユニーク ID をどのように得られるか?」節参照 。
    mysql> select LAST_INSERT_ID();         -> 1
    
    FORMAT(Nr, Num)
    '#,###,###.##' のような形式(小数部 Num 桁)で数値 Nr を整形 します。
    mysql> select FORMAT(12332.33, 2);      -> '12,332.33'
    
    VERSION
    MySQL サーバのバージョンを返します。
    mysql> select version();                -> '3.21.16-beta-log'
    
    GET_LOCK(String,timeout)
    'timeout' 秒のタイムアウトで、'String' と名付けられたロックの獲得を試み ます。ロックを獲得した場合は 1, タイムアウトの場合は 0, エラーの場合(メ モリ不足やスレッドが mysqladmin kill で殺された場合など)は NULL が返ります。RELEASE_LOCK の実行、新しい GET_LOCK の実行、 スレッドの終了の場合に、ロックは解放されます。この関数はアプリケーション ロックやレコードロックのシミュレートのために使用できます。
    mysql> select get_lock("automaticly released",10);     -> 1
    mysql> select get_lock("test",10);		       -> 1
    mysql> select release_lock("test");                    -> 1
    mysql> select release_lock("automaticly released")     -> NULL
    
    RELEASE_LOCK(String)
    このスレッドが GET_LOCK で獲得したロックを解放します。ロックが解 放された場合は 1, このスレッドによってロックされていない場合は 0, 'String' が存在しない場合は NULL が返ります。

    GROUP BY 節の関数

    COUNT(Expr)
    NULL の行の数を数えます。count(*) は、SELECT 中 に他の項目が使用されなければ、非常に速く返るように最適化されています。
    select count(*) from student;
    select count(if(length(name)>3,1,NULL)) from student;
    
    AVG(expr)
    expr の平均値。
    MIN(expr)
    MAX(expr)
    expr の最小/最大値。min()max() が文字列引数を取ると、 最小/最大の文字列値を返します。
    SUM(expr)
    expr の合計。
    STD(expr)
    STDDEV(expr) (Oracle format)
    表現の標準誘導(standard derivative)。これは ANSI SQL に対する拡張 です。
    BIT_OR(expr)
    expr 内の全てのビットの論理 OR。64 ビットの精度で計算されます。
    BIT_AND(expr)
    expr 内の全てのビットの論理 AND。64 ビットの精度で計算されます。

    MySQL は GROUP BY 使用を拡張します。SELECT 表現内で GROUP BY 部に現れない項目または計算を使用できます。これは 'このグルー プのための全ての可能な値' を表しています。この使用により、必要ない項目で のソートとグループが避けられるので、高い性能が得られます。例えば、次のク エリでは b.name でグループする必要はありません:

    SELECT a.id,b.name,COUNT(*) from a,b WHERE a.id=b.id GROUP BY a.id
    

    ANSI SQL では、次のクエリでは GROUP BY 内に customer.name を追加 する必要があります。MySQL では name は冗長です。

    SELECT order.custid,customer.name,max(payments) from order,customer
    WHERE order.custid = customer.custid GROUP BY order.custid;
    

    GROUP BY または ORDER BY 節で表現を使用できないことに注意 してください。他の方法として表現の別名を使用でき、問題の解決としてこれを 使用できます:

    SELECT id,FLOOR(value/100) AS val FROM table_name GROUP BY id,val ORDER BY val
    

    Create database 構文

    CREATE DATABASE database_name
    

    データベースを与えられた名前で作成します。名前は文字、数字または '_' 文字だけを含むことができ、文字または _ で始まらないと いけません。データベース名の最大長は 64 文字です。MySQL 内の全 てのデータベースはディレクトリです。そのため、CREATE DATABASE は、 MySQL データベースディレクトリ内にディレクトリを作成するだけで す。mysqladmin でもデータベースを作成することができます。 「様々な MySQL プログラムの概要」節参照

    Drop database 構文

    DROP DATABASE database_name
    

    データベース内の全てのテーブルを破棄し、データベースを削除します。この コマンドはとても注意して行なってください! DROP DATABASE はディ レクトリからいくつのファイルが削除されたかを返します。通常これはテーブル数 * 3 です。mysqladmin でもデータベースを破棄することができます。 「様々な MySQL プログラムの概要」節参照

    CREATE TABLE 構文

    CREATE TABLE table_name ( create_definition,... )
    
    create_definition:
      column_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
                       [ PRIMARY KEY ] [reference_definition]
      or	PRIMARY KEY ( index_column_name,... )
      or	KEY [index_name] KEY( index_column_name,...)
      or	INDEX [index_name] ( index_column_name,...)
      or	UNIQUE [index_name] ( index_column_name,...)
      or    FOREIGN KEY index_name ( index_column_name,...) [reference_definition]
      or	CHECK (expr)
    
    type:
            TINYINT[(length)] [UNSIGNED] [ZEROFILL]
      or    SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
      or    MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
      or    INT[(length)] [UNSIGNED] [ZEROFILL]
      or    INTEGER[(length)] [UNSIGNED] [ZEROFILL]
      or    BIGINT[(length)] [UNSIGNED] [ZEROFILL]
      or    REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
      or    DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
      or	FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
      or	DECIMAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
      or	NUMERIC[(length,decimals)] [UNSIGNED] [ZEROFILL]
      or    CHAR(length) [BINARY],
      or    VARCHAR(length) [BINARY],
      or    DATE
      or    TIME
      or    TIMESTAMP
      or    DATETIME
      or    TINYBLOB
      or    BLOB
      or    MEDIUMBLOB
      or    LONGBLOB
      or    TINYTEXT
      or    TEXT
      or    MEDIUMTEXT
      or    ENUM(value1,value2,value3...)
      or    SET(value1,value2,value3...)
    
    index_column_name:
            column_name [ (length) ]
    
    reference_definition:
            REFERENCES table_name [( index_column_name,...)]
                       [ MATCH FULL | MATCH PARTIAL]
                       [ ON DELETE reference_option]
                       [ ON UPDATE reference_option]
    
    reference_option:
            RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
    

    項目型」節参照

    FOREIGN KEY, CHECK そして REFERENCE 構文は互換のためだけにあります。(他 の SQL サーバからのコードより簡単に移行し、リファレンス付きのテーブルを 生成するようなアプリケーションを実行するため)。これらは実際には何もしま せん。 「MySQL に無い機能」節参照

    項目が DEFAULT の値を持たず、NOT NULL として宣言されていない場合は、デフォ ルト値は NULL です。

    項目が DEFAULT の値を持たず、NOT NULL として宣言されている場合は、MySQL は自動的にその項目にデフォルト値を割り当てます。

    ALTER TABLE 構文

    ALTER [IGNORE] TABLE table_name alter_spec [, alter_spec ...]
    
    alter_specification:
    	ADD [COLUMN] create_definition [AFTER column_namn | FIRST]
    or	CHANGE [COLUMN] old_column_name create_definition
    or	ALTER [COLUMN] column_name { SET DEFAULT literal | DROP DEFAULT }
    or	ADD INDEX [index_name] ( index_column_name,...)
    or	ADD UNIQUE [index_name] ( index_column_name,...)
    or	DROP [COLUMN] column_name
    or	DROP PRIMARY KEY
    or	DROP INDEX key_name
    or	RENAME [AS] new_table_name
    

    ALTER TABLE のいくつかの使用例:

    CREATE TABLE t1 (a INTEGER,b CHAR(10));
    INSERT INTO t1 VALUES(1,"testing");
    ALTER TABLE t1 RENAME t2;
    ALTER TABLE t2 CHANGE a a TINYINT NOT NULL, CHANGE b c CHAR(20);
    ALTER TABLE t2 ADD d TIMESTAMP;
    ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
    ALTER TABLE t2 DROP COLUMN c;
    ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c);
    DROP TABLE t2;
    

    DROP TABLE 構文

    DROP TABLE table_name [, table_name...]

    一つまたはそれ以上のテーブルを削除します。全てのデータと定義は削除され ます。このコマンドはそれを簡単に行ないます!

    DELETE 構文

    DELETE FROM table_name WHERE where_definition

    影響されたレコード数を返します。

    WHERE 節なしで削除を行った場合、テーブルが再生成されます。これは 各行を削除するよりもとても速いです。この場合、影響されたレコードは 0 と してコマンドが返ります。MySQL は削除された行の数を返しません。 テーブル定義ファイル table_name.frm が正しい限り、テーブルを再生 成できることを確かめるために、データファイルをオープンすることはなしに、 再生成が行われるためです。

    SELECT 構文

    SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,... [INTO OUTFILE 'file_name' ...] [ FROM table_references [WHERE where_definition ] [GROUP BY column,...] [HAVING where_definition] [ ORDER BY column [ASC | DESC] ,..] [LIMIT [offset,] rows] [PROCEDURE procedure_name]]

    使用される全てのキーワードは厳密に上記の順の必要があります。例えば HAVING 節は GROUP BY の後で ORDER BY 節の前に来なけ ればいけません。

    必要に応じて(Perl のように)、自動的に文字列は数値に、数値は文字列に変換 されます。比較操作 ((=, <>, <=, <, >=, >)) では、引数が数値の場合 引数は数値として比較されます。そうでない場合は引数は文字列として比較され ます。全ての文字列比較はデフォルトでは ISO8859-1 (英語でも優秀に働くスカ ンジナビア文字セット) によるケース非依存です。

    select 1 > '6x';        ->      0
    
    select 7 > '6x';        ->      1
    
    select 0 > 'x6';        ->      0 
    
    select 0 = 'x6';        ->      1
    

    Join 構文

    MySQL は次の JOIN 構文をサポートします:

    table_reference, table_reference
    table_reference [CROSS] JOIN table_reference
    table_reference LEFT [OUTER] JOIN table_reference ON conditional-expr
    table_reference LEFT [OUTER] JOIN table_reference USING (column-commalist)
    table_reference NATURAL LEFT [OUTER] JOIN table_reference
    { oj table_reference LEFT OUTER JOIN table_reference ON conditional-expr }
    

    最後の例は ODBC 構文です。

    INSERT 構文

    	INSERT INTO table [ (column_name,...) ] VALUES (expression,...)
    or	INSERT INTO table [ (column_name,...) ] SELECT ...
    

    expression は column_name リスト(または column_name リストが与えられない 場合はテーブル)の前の項目を使用します。

    次は、複数行の INSERT ステートメントを保持します:

    REPLACE 項目

    	REPLACE INTO table [ (column_name,...) ] VALUES (expression,...)
    or	REPLACE INTO table [ (column_name,...) ] SELECT ...
    

    これは正確に INSERT と似た動きをします。テーブル内に同じユニークキーを 持つ古いレコードがいくつかある場合に、古いレコード(一つまたは複数)がこの レコードが挿入される前に削除されることが異なります。 「INSERT 構文」節参照 .

    LOAD DATA INFILE 構文

    LOAD DATA INFILE 'text_file_name.text' [REPLACE | IGNORE] INTO TABLE table_name [FIELDS [TERMINATED BY ',' [OPTIONALLY] ENCLOSED BY '"' ESCAPED BY '\\' ]] [LINES TERMINATED BY '\n'] [(Field1, Field2...)]

    これはサーバに置かれたテキストファイルから行を読み込むために使用され、と ても高速です。サーバ - クライアントプロトコルはまだ接続上のファイルをサ ポートしていません。クライアント上にだけファイルがある場合は、LOAD DATA INFILE を使用する前に、可能ならば圧縮して rcpftp でサーバにコピーしてください。テキストファイルへの全てのパ スはデータベースディレクトリへの相対です。

    テキストファイルにデータを書き込むには、 SELECT ... INTO OUTFILE 'interval.txt' fields terminated by ',' enclosed by '"' escaped by '\\' lines terminated by '\n' FROM .... 構文を使用します。

    通常、テキストファイル型オプションには何も記述するべきではありません。デ フォルトは tab 文字で区切られた項目のコンパクトテキストファイルで、 全ての行は改行で終ります。項目内のタブ, 改行と \\ が前 に置かれます。NULL は \N として読まれ、書かれます。

    FIELDS TERMINATED BY のデフォルト値は \t です。

    FIELDS [OPTIONALLY] ENCLOSED BY のデフォルト値は '' です。

    FIELDS ESCAPED BY のデフォルト値は '\\' です。

    LINES TERMINATED BY のデフォルト値は '\n' です。

    FIELDS TERMINATED BYLINES TERMINATED BY は1文字以上に できます。

    LINES TERMINATED BY が空文字列で FIELDS TERMINATED BY が空 でなければ、行も FIELDS TERMINATED BY で終端されます。

    FIELDS TERMINATED BYFIELDS ENCLOSED BY の両方が空文字 列 ('') なら、固定行形式("境界なし" 読み込み形式)を与えます。固定 行サイズでは、NULL 値は空白文字列として出力されます。 ENCLOSED BY 内で OPTIONALLY を記述すると、SELECT ... INTO 記述で、文字列は ENCLOSED BY で囲まれます。

    二重の ENCLOSED BY 文字は、ENCLOSED BY で始まる文字列から 削除されます。例えば ENCLOSED BY '"' では:

    "The ""BIG"" boss"  -> The "BIG" boss
    The "BIG" boss	    -> The "BIG" boss
    

    ESCAPED BY が空でなければ、次の文字はエスケープ文字が前に置かれま す: ESCAPED BY, ASCII 0, そして FIELDS TERMINATED BY, FIELDS ENCLOSED BYLINES TERMINATED BY 内の最初の 文字。

    FIELDS ENCLOSED BY が空でなければ、NULLNULL 値 として読まれます。FIELDS ESCAPED BY が空でなければ \NNULL 値として読まれます。

    REPLACE が使用されると、新しい行は同じユニークインデックスを持つ 全ての行を置き換えます。IGNORE が使用されると、同じユニークキーを 持つレコードが既に存在していた場合、行はスキップされます。上記オプション がなければエラーになります。重複インデックスのエラーになった場合、テキス トファイルの残りは無視されます。

    LOAD DATA がサポートされないいくつかのケース:

    全ての行はテーブルに読み込まれます。行の項目が少ない場合は、残りの項目に はデフォルト値が設定されます。TIMESTAMP 項目は、NULL 値がその列に 与えられた場合、または項目リストが使用された時に TIMESTAMP 項目が、 その項目リストにない場合に、現在の時刻を設定します (最後のケースでは、最 初の TIMESTAMP 項目だけを保持します)。

    セキュリティ上の理由により、テキストファイルはデータベースディレクトリ内 にあるか全員に読み込み可能でなければいけません。LOAD DATA INFLIE を使用したい各ユーザは、user 特権テーブルの 'File_priv' 項目も 'Y' でな ければなりません! 「特権システムがどのように働くか?」節参照

    LOAD DATA INFILE は全ての入力を文字列としてみるため、enum または set 項目には、INSERT ステートメントで使用できるよう には、数値は使用できません。全ての enumset は文字列で 与えられる必要があります!

    エスケープ構文についてのこれ以上の情報は 「リテラル。文字列と数値をどのように書くか?」節参照 。

    LOAD DATA 問い合わせが行なわれた時、次の情報文字列が C API 関数 mysql_info() で得られます。

    Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

    Warnings は、精度の損失なしで置かれなかった項目、読み込んだテキスト行か ら値を得なかった項目(行が短かすぎると発生)、与えられた項目に適合できるさ らなるデータを持つ行で増加します。warning はまた time, date, timestamp または datetime 項目が 0 に設定された時にも与えられます。

    全ての項目をロードする例:

    LOAD DATA INFILE 'persondata.text' INTO TABLE persondata;
    

    私のテーブルをできるだけ速く/小さく扱う方法は?」節参照

    UPDATE 構文

    UPDATE table SET column=expression,... WHERE where_definition
    

    全ての更新は左から右に行なわれます。expression 内で項目をアクセスすると、 更新は項目の現在の値(与えられた値またはデフォルト値)を使用します。

    UPDATE persondata SET count=count+1
    

    UPDATE ステートメントはいくつの行が実際に変更されたかを返します。 MySQL 3.22 では mysql_info() は適合した行数と更新された 行数と、更新中にいくつの警告を得たかを返します。

    SHOW 構文。テーブルや項目などについての情報を得る

    	SHOW DATABASES [LIKE wild]
    or 	SHOW TABLES [FROM database] [LIKE wild]
    or	SHOW COLUMNS FROM table [FROM database] [LIKE wild]
    or	SHOW INDEX FROM table [FROM database]
    or	SHOW STATUS
    or	SHOW VARIABLES [LIKE wild]
    

    データベース、テーブル、項目についての情報を与えます。LIKE wild 部が使用された場合、wild 文字列は通常の SQL ワイルドカード (% と _) です。FIELDSCOLUMNS の別名として使用され、KEYSINDEXES の別名として使用されます。

    STATUS は、mysqladmin status と同様に、サーバからのステー タス情報を与えます。出力は次とは異なるかもしれません:

    Uptime Running_threads Questions Reloads Open_tables
    119 1 4 1 3
    VARIABLESMySQL システム変数のいくつかの値を示します。 これらの変数の多くは、mysqld への様々なオプションで変更できます!

    EXPLAIN 構文。SELECT についての情報を得る

    	EXPLAIN SELECT select_options
    

    テーブルをどのようにどの順で結合するのかの情報を与えます。EXPLAIN の助 けで、レコードを見つけるためにキーを使用するより速い select を得るために、 さらなるインデックスをテーブルに追加すべき時を見ることができます。また、オプティ マイザが最適な順でテーブルを結合するかどうかを見ることもできます。select への STRAIGHT_JOIN オプションで、特定の結合順序の使用をオプティマイザ に強制することができます。

    様々な結合タイプ:

    system
    テーブルは1レコードだけを持ちます (= システムテーブル)
    const
    テーブルは、多くても1つの適合するレコード(問い合わせの開始時に読まれる)を持ち ます。このテーブル内の全ての項目は、オプティマイザの休止によって定数と見なされま す。
    eq_ref
    前のテーブルの各組合せについて、一つの行がこのテーブルから読まれます。
    ref
    前のテーブルの各組合せについて、適合するインデックスの全ての行がこのテー ブルから読まれます。
    range
    与えられたインデックス範囲内の行だけがインデックスを通じて取り出されます。 拡張項目はどのインデックスが使用されたかを知らせます。
    all
    前のテーブルの各組合せについて、完全なテーブル scan が行なわれます。

    これは EXPLAIN の助けで最適化された join の例です。

    EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,
            tt.ProjectReference, tt.EstimatedShipDate,
            tt.ActualShipDate, tt.ClientID,
            tt.ServiceCodes, tt.RepetitiveID,
            tt.CurrentProcess, tt.CurrentDPPerson,
            tt.RecordVolume, tt.DPPrinted, et.COUNTRY,
            et_1.COUNTRY, do.CUSTNAME
            FROM tt, et, et AS et_1,
            do
            WHERE tt.SubmitTime Is Null and tt.ActualPC =
            et.EMPLOYID and tt.AssignedPC =
            et_1.EMPLOYID and tt.ClientID =
            do.CUSTNMBR;
    

    EXPLAIN は次を返します:

    table   type    possible_keys   key     key_len ref     rows    Extra
    et      ALL     PRIMARY NULL    NULL    NULL    74
    do      ALL     PRIMARY NULL    NULL    NULL    2135
    et_1    ALL     PRIMARY NULL    NULL    NULL    74
    tt      ALL     AssignedPC,ClientID,ActualPC    NULL    NULL    NULL   3872
            range checked for each record (key map: 35)
    

    この場合 MySQL は全てのテーブルに完全な結合を行っています! 各 テーブル内の行の数の製品が検討されるので、これはかなり長い時間かかります! 全てのテーブルが 1000 レコード持っていた場合、MySQL は 1000^4 = 1000000000000 行を調べないといけません。テーブルがもっと大きいと、どれく らいの時間かかるか想像できます...。

    この場合、最初の間違いは MySQL はまだ、異なった宣言がされた項目 のインデックスを能率的に使用しないことです: (varchar() と char() はこの 文脈では異なりません)

    この場合、tt.ActualPCchar(10)et.EMPLOYIDchar(15) です。

    修正:

    mysql> alter table tt change ActualPC ActualPC varchar(15);
    

    そして上の EXPLAIN は次を示します:

    table   type    possible_keys   key     key_len ref     rows    Extra
    tt      ALL     AssignedPC,ClientID,ActualPC    NULL    NULL    NULL   3872
            where used
    do      ALL     PRIMARY NULL    NULL    NULL    2135
            range checked for each record (key map: 1)
    et_1    ALL     PRIMARY NULL    NULL    NULL    74
            range checked for each record (key map: 1)
    et     eq_ref  PRIMARY PRIMARY 15      tt.ActualPC    1
    

    これは完全ではありませんが、かなりましです。このバージョンは数秒で実行さ れます。

    さらに、

    mysql> alter table tt change AssignedPC AssignedPC varchar(15),
                          change ClientID Clientid     varchar(15);
    

    EXPLAIN から次が得られます:

    table   type    possible_keys   key     key_len ref     rows    Extra
    et      ALL     PRIMARY NULL    NULL    NULL    74
    tt      ref     AssignedPC,ClientID,ActualPC    ActualPC        15
            et.EMPLOYID   52      where used
    et_1    eq_ref  PRIMARY PRIMARY 15      tt.AssignedPC  1
    do      eq_ref  PRIMARY PRIMARY 15      tt.Clientid    1
    

    Which is 'almost' as good as it can get. The problem is that MySQL assumes that tt.AcutalPC is evenly distributed which isn't the case in the tt.

    Fortunately it is easy to tell MySQL about this:

    shell> isamchk --analyze PATH_TO_MYSQL_DATABASE/tt
    shell> mysqladmin refresh
    

    And now the join is 'perfect':

    table   type    possible_keys   key     key_len ref     rows    Extra
    tt      ALL     AssignedPC,ClientID,ActualPC    NULL    NULL    NULL
            3872     where used
    et      eq_ref  PRIMARY PRIMARY 15      tt.ActualPC    1
    et_1    eq_ref  PRIMARY PRIMARY 15      tt.AssignedPC  1
    do      eq_ref  PRIMARY PRIMARY 15      tt.Clientid    1
    

    DESCRIBE 構文。項目についての情報を得る

    (DESCRIBE | DESC) table [column]

    項目についての情報を与えます。このコマンドは Oracle の互換のためにありま す。 「SHOW 構文。テーブルや項目などについての情報を得る」節参照 。項目は項目名または文字列です。文字列はワイルドカードを 含めます。

    LOCK TABLES 構文

    LOCK TABLES table_name [AS alias] READ|WRITE [, table_name READ|WRITE]
    ...
    UNLOCK TABLES
    

    このスレッドのためにテーブルをロックします。スレッドがテーブルに READ ロッ クを持つ場合、そのスレッド(と他の全てのスレッド)はテーブルからの読み込み だけができます。スレッドがテーブルに WRITE ロックを持つ場合、このスレッ ドだけがテーブルの READ と WRITE ができます。全てのスレッドはそれらが全 てのロックを得るまで待ちます(タイムアウト無し)。

    LOCK TABLES を使用するとき、使用しようとする全てのテーブルをロッ クすべきです! このポリシーはテーブルロックをデッドロックフリーにするこ とを確かにします。

    LOCK TABLES trans READ, customer AS c WRITE
    SELECT SUM(value) FROM trans WHERE customer_id= #some_id#;
    UPDATE customer SET total_value=#value_from_last_statement# WHERE
    customer_id=#some_id#
    UNLOCK TABLES
    

    全てのテーブルは、他の LOCK TABLES を発行した時、またはサーバへの 接続がクローズされた場合、自動的にアンロックされます。

    通常はテーブルをロックする必要はありません。とにかくテーブルをロックした い時にはいくつかの場合があります:

    いくつかの場合、ユーザレベルロック: GET_LOCK() と RELEASE_LOCK() の使用 によっても解決できます。これらのロックはサーバ内のハッシュテーブル内に保 持され、高速のため pthread_mutex で実装されました。 「その他の関数」節参照

    SET OPTION 構文

    SET [OPTION] SQL_VALUE_OPTION=value, ...
    

    使用されたオプションは実際には現在のセッション全体に対して残ります。

    様々なオプション:

    SQL_SELECT_LIMIT=value
    全ての select で返されるレコードの最大数。select が limit 節を持っていた 場合、それはこのステートメントを上書きします。新しい接続のデフォルト値は '無制限' です。
    SQL_BIG_TABLES= 0 | 1
    1 に設定した場合、全ての一時テーブルはメモリの代わりにディスク上に格納さ れます。これは少し遅くなりますが、大きな一時テーブルを要求する大きな select で、エラー The table ### is full になることはありません。 新しい接続のデフォルト値は 0 です(メモリ一時テーブルを使用します)。
    SQL_BIG_SELECTS= 0 | 1
    1 に設定した場合、とても長い時間が掛かるであろう select を行なおうとする と、MySQL は abort します。これは、間違った WHERE ステー トメントが発行された時に有用です。max_join_size 行以上を検討する ような SELECT が大きなクエリと定義されます。新しい接続のデフォル ト値は 0 です(これは全ての SELECT を許します)。
    CHARACTER SET character_set_name | DEFAULT
    これはクライアントからのそしてクライアントへの全ての文字列を与えられたマッ ピングにマップします。現在 character_set_name のオプションは cp1251_koi8 だけですが、ファイル mysql_source_directory/sql/convert.cc を編集することにより、新し いマッピングを簡単に追加できます。デフォルトマッピングを戻すには character_set_name として DEFAULT を使用します。
    SQL_LOG_OFF= 0 | 1
    1 に設定した場合、クライアントがプロセスリスト特権を持っていると、このク ライアントのための標準ログへのロギングは行われません。これは更新ログには 影響しません!
    TIMESTAMP= timestamp_value | DEFAULT
    このクライアントの時刻を設定します。これは、行をリストアするための更新ロ グを使用する場合、オリジナルタイムスタンプを得るために使用されます。
    LAST_INSERT_ID= #
    LAST_INSERT_ID() から返される値を設定します。これは、テーブルを更新する コマンド内で LAST_INSERT_ID() を使用した時、更新ログに格納されます。

    GRANT 構文(互換関数)

    GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE,
     REFERENCES (column list), USAGE))
     ON table TO user,... [WITH GRANT OPTION]
    

    このコマンドは何も行ないません。これが MySQL にあるのは互換性の ためだけです。(他の SQL サーバからのコードの移行をより簡単にするため)。 MySQL の特権は MySQL 承認テーブルで操作されます。 「特権システムがどのように働くか?」節参照

    CREATE INDEX 構文(互換関数)

    CREATE [UNIQUE] INDEX index_name ON table_name ( column_name[(length)],... )

    バージョンが 3.22 よりも前の MySQL では、この関数は何も行ないません。こ れはインデックスを生成する ALTER TABLE 呼び出しにマップされていま す。 「ALTER TABLE 構文」節参照

    通常、全てのインデックスは CREATE TABLE と同時に生成できます。 「CREATE TABLE 構文」節参照

    (col1, col2) は2つの項目からなる複合インデックスを作成します。イ ンデックスは与えられた項目の結合のように見えます。CREATE TABLE 中 で INDEX(col1,col2) の代わりに INDEX(col1), INDEX(col2) を使えば、一つの複合インデックスの代わりに二つの別々 のキーが代わりに得られます。

    SELECT * FROM table WHERE col1=# AND col2=#
    

    (col1,col2) のインデックスの場合は、正しい行が直接 fetch されます。 (col1), (col2) の場合は、どちらのインデックスの方がより少 ない行を見つかるかをオプティマイザが決定し、このインデックスが行を fetch するために使用されます。

    テーブルがインデックス (col1,col2,col3...) を持っている場合は、こ の頭の方がオプティマイザによって行を見つけるために使用されます。これは、 次のような検索能力をあなたに与えることを意味します: (col1) そして (col1,col2) そして (col1,col2,col3)...

    MySQL は、インデックスを通して行を配置するために、インデックス の一部分を使用することはできません。

    (col1,col2,col3) 定義では:

    SELECT * FROM table WHERE col1=#
    SELECT * FROM table WHERE col2=#
    SELECT * FROM table WHERE col2=# and col3=#
    

    最初のクエリだけがインデックスを使用します。

    LIKE 引数がワイルド文字で始まらない定数文字列の場合、 MySQL はインデックスも使用します:

    次はインデックスを使用します:

    SELECT * from table WHERE key_column like "Patrick%";
    SELECT * from table WHERE key_column like "Pat%_ck%";
    

    上のケースでは、Patrick <= key_column < Patric1Pat <= key_column < Pau の行だけが考慮されます。

    次の select はインデックスを使用しません:

    SELECT * from table WHERE key_column like "%Patrick%";
    SELECT * from table WHERE key_column like other_column;
    

    column_name(length) 構文で string 項目でだけ一部のインデッ クスを記述できます。これはインデックスファイルをより小さくします。

    CREATE INDEX part_of_name ON customer (name(10))
    

    多くの名前は最初の10文字が異なることは全く普通なので、上の定義は名前の検 索を遅くしませんが、多くのディスクを節約し、挿入を速くします!

    DROP INDEX 構文(互換関数)

    DROP INDEX index_name

    この関数はバージョン 3.22 より前の MySQL では何も行いません。これ は INDEX または UNIQUE 定義を破棄する ALTER TABLE 呼び出しにマップされています。 「ALTER TABLE 構文」節参照

    Comment 構文

    MySQL# から行末まで/* 複数行 */ コメント 形式をサポートします。

    select 1+1;	# This comment is to the end of line
    select 1 /* in-line-comment */ + 1;
    select 1+
    /*
    This will be ignored
    */
    1;
    

    MySQL-- ANSI SQL 形式コメントをサポートしません。 「コメント開始としての --」節参照 。

    CREATE FUNCTION 構文

    CREATE FUNCTION <function_name> RETURNS [string|real|integer]
           SONAME <name_of_shared_library>
    
    DROP FUNCTION <function_name>
    

    ユーザ定義可能関数 (UDF:User definable functions) は、ABS()concat() のようなネイティブ MySQL 関数として機能する新し い関数を MySQL に拡張する方法です。UDF は C または C++ で書かれ、 OS で動的ロードが機能することを要求します。ソース配布は、5つの新しい関 数を定義するファイル `udf_example.cc' を含んでいます。

    関数名、型、共有ライブラリは 'mysql' データベース内の新しいシステムテー ブル 'func' に保存されます。新しい関数の作成を可能にするためには、データ ベース 'mysql' に書き込み権が必要です。MySQL を --skip-grant-tables で開始する場合は、UDF 初期化もスキップされます。

    各定義関数は xxxx_init 関数と xxx_deinit 関数を持ちます。init 関数は関数 のためにメモリを割り当て、結果の最大長(文字列関数)、小数点の桁数(double 関数)、結果が null 値になるかどうかについて main 関数に知らせます。

    関数が 'error' 引数を 1 に設定する場合、その関数はそれ以上呼ばれず、 mysqld はこの関数のインスタンスを呼び出す全てについて NULL を返します。

    関数への全ての文字列引数は、バイナリデータの操作をできるように、文字列の ポインタ + 長さとして与えられます。全ての関数はスレッドセーフでないとい けないことを知っていてください。これは変更されるようなグローバル変数また は静的変数の割り当ては許されないことを意味します! メモリを必要とする場 合は、init 関数内で割り当て、__deinit 関数でこれを解放すべきです。

    動的ロードファイルは共有可能としてコンパイルされるべきです (次のようなも の: gcc -shared -o udf_example.so myfunc.cc)。次を行うことで正し い全てのスイッチを簡単に得ることができます: cd sql ; make udf_example.o 書き込みを行うコンパイル行を取り出し、行末近くの '-c' を 削除して、コンパイル行の最後に -o udf_example.so を追加してください。結 果のライブラリ (udf_example.so) は ld によって検索されるどこかのディレク トリ、例えば /usr/lib にコピーしてください。

    サンプル関数に関するいくつかの注意:

    ライブラリがインストールされた後、mysqld に新しい関数を次のコマン ドで知らせる必要があります:

    CREATE FUNCTION metaphon RETURNS STRING SONAME "udf_example.so";
    CREATE FUNCTION myfunc_double RETURNS REAL SONAME "udf_example.so";
    CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "udf_example.so";
    CREATE FUNCTION lookup RETURNS STRING SONAME "udf_example.so";
    CREATE FUNCTION reverse_lookup RETURNS STRING SONAME "udf_example.so";
    

    関数は一度だけ作成されます。 関数は次のようにして削除できます:

    DROP FUNCTION metaphon;
    DROP FUNCTION myfunc_double;
    DROP FUNCTION myfunc_int;
    DROP FUNCTION lookup;
    DROP FUNCTION reverse_lookup;
    

    CREATE FUNCTIONDROP FUNCTIONfunc テーブルを 更新します。全てのアクティブな関数はサーバの再起動ごとにリロードされます (--skip-grant-tables が与えられない場合)。

    MySQL は予約語について厳密か?

    よくある問題は、timestampgroupMySQL に埋め 込まれているデータ型や関数の名前を項目名として持つテーブルの作成を試みる ことをくいとめます。それを行なうことは許されています(例えば、ABS は項目名として許されます)が、名前が項目名でもある関数使用時には、関数名 と '(' の間に空白は許されません。

    次は MySQL での明白な予約語です。これらのほとんどは (例えば) group は ANSI SQL92 では項目名やテーブル名としては禁じられてます。 いくつかは MySQL が必要とするためで、(現在) Yacc パーサを使用し ています:

    action add all alter
    and as asc auto_increment
    between bigint bit binary
    blob both by cascade
    char character change check
    column columns create data
    database databases date datetime
    day day_hour day_minute day_second
    dayofweek dec decimal default
    delete desc describe distinct
    double drop escaped enclosed
    enum explain fields float
    float4 float8 foreign from
    for full grant group
    having hour hour_minute hour_second
    ignore in index infile
    insert int integer interval
    int1 int2 int3 int4
    int8 into is join
    key keys leading left
    like lines limit lock
    load long longblob longtext
    match mediumblob mediumtext mediumint
    middleint minute minute_second month
    natural numeric no not
    null on option optionally
    or order outer outfile
    partial precision primary procedure
    privileges read real references
    rename regexp repeat replace
    restrict rlike select set
    show smallint sql_big_tables sql_big_selects
    sql_select_limit sql_log_off straight_join starting
    table tables terminated text
    time timestamp tinyblob tinytext
    tinyint trailing to use
    using unique unlock unsigned
    update usage values varchar
    varying varbinary with write
    where year year_month zerofill
    次のシンボル(上の表から)は ANSI SQL では許されませんが、MySQL では項目名/テーブル名として許されます。これらの名前のいくつかはとても自 然な名前で、多くの人が既に使用しているからです。


    Go to the first, previous, next, last section, table of contents.