文字列は ' または " で括られます。
\ はエスケープ文字です。次のエスケープ文字が認識されます:
\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
\
'
"
'
内での "
と '
内での "
はエスケープしては
いけません。
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 は、何かが名前か数値かを決定できることが必要なため、次の 特殊な場合が発生します。
1e
のような名前を使用することは勧められません。これは 1e+1
のような表現は、表現 1e + 1
または数値 1e+1
のように解釈さ
れるためです。
名前中に .
や @
のような記号文字は許されません。これらは
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
となります。そして 9999999999999999
は
2147483647
となります。
そして、int
が符号無しの場合、上の格納される値は 0
と
4294967296
になります。
同じ規則が全ての他の整数型にも適用されます。
割り当てられた領域を超える int(4) 項目のデータを返す時、MySQL
は 9.99 を返します。オペレーションが UPDATE
の場合は、警告が出さ
れます。
decimal(4,2)
のような型は、2桁の小数値を持った最大4文字を意味する
ことに注意して下さい。これは -.99
-> 9.99
の範囲を与えます。
いくつかの丸めの問題を回避するために、MySQL は浮動小数点の項目に
格納する全てを常に、小数の数に一致するように丸めます。これは、
float(8,2)
内に格納される 2.333
は 2.33
として格納
されることを意味します。
TIMESTAMP
型
1970年12月1日 00:00 から 2106年のいつかまでの範囲を持ち、1秒の精度です。
TIMESTAMP 項目は、NULL
が設定されるか、ステートメント中で項目が更
新されなければ INSERT
と UPDATE
ステートメントで自動的に更
新されます。インデックス(の一部)にできます。注意: 多くの timestamp 項目
が行にある場合は、最初の timestamp 項目だけが自動的に更新されます。任意
の timestamp 項目は NULL
を設定すれば、現在の時刻に設定されます。
表示サイズに依存して、次の形式の一つが得られます: "YYYY-MM-DD HH:MM:SS",
"YY-MM-DD HH:MM:SS", "YYYY-MM-DD" or "YY-MM-DD"。
TEXT
と BLOB
型
これらは上限無しの可変長を持つことができるオブジェクトです。全ての TEXT
と BLOB オブジェクトはその長さ(オブジェクトの型に依存して 1 から 4 バイ
ト)と共に格納されます。使用可能な TEXT
と BLOB
の最大長は、
有効なメモリとクライアントバッファに依存します。TEXT
と
BLOB
の違いは、TEXT
はケースに依存しないでソートと比較され、
BLOB
はケースに依存して(文字コードで)比較されることだけです。
TEXT
と BLOB
オブジェクトはインデックスにはできません。
BLOB はバイナリ巨大オブジェクト(binary large object)で、大きなデータを保 持できます。4種類の BLOB があります 「項目型」節参照 。通常、BLOB は制 限無しの VARCHAR と見なすことができます。
TEXT
は、ソートと比較がケースに依存しない BLOB
です。
BLOB
/TEXT
項目はメッセージバッファより大きくできません。サー
バとクライアントのメッセージバッファを変更する必要があることに注意してく
ださい。 「MySQL のバッファサイズの変更方法」節参照 。
MyODBC
は BLOB
を LONGVARBINARY
として、そして
TEXT
を LONGVARCHAR
として定義します。
BLOB
と TEXT
項目の制限:
BLOB
または TEXT
はインデックスまたはインデックスの一部に
はできません。
BLOB
または TEXT
のソートまたはグループ時には、BLOB の最初
の max_sort_length
(デフォルト 1024) だけが使用されます。この値は、
mysqld デーモン起動時に -O
オプションで変更できます。
BLOB
/TEXT
を含んだ表現でグループできます: SELECT
id,SUBSTR(blob,1,100) GROUP BY 2
BLOB
と TEXT
では、終りの空白は CHAR
や
VARCHAR
のようにはカットされません。
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 の使用時は?」節参照 .
BLOB
と TEXT
型を除く MySQL の全ての項目はインデッ
クスを持つことができます。適切な項目でのインデックスの使用は、select の
性能を向上する最良の方法です。
CHAR
と VARCHAR
項目には接頭部にインデックスを持つことができ
ます。次の例は、項目の最初の 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 |
SELECT
と WHERE
節で使用する関数
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
+
-
*
/
NULL
を返します。
mysql> select 102/(1-1); -> NULL
これらは最大 64 ビットの範囲を持ちます。MySQL は bigint (64 bit) 演算を使用するためです。
|
mysql> select 29 | 15; -> 31
&
mysql> select 29 & 15; -> 13
BIT_COUNT()
mysql> select bit_count(29); -> 4
全ての論理関数は 1 (TRUE) または 0 (FALSE) を返します。
NOT
!
mysql> select NOT 1; -> 0 mysql> select NOT NULL; -> NULL mysql> select ! (1+1); -> 0 mysql> select ! 1+1; -> 1
OR
||
mysql> select 1 || 0; -> 1 mysql> select 0 || 0; -> 0 mysql> select 1 || NULL; -> 1
AND
&&
mysql> select 1 && NULL; -> 0 mysql> select 1 && 0; -> 0
1 (TRUE), 0 (FALSE) または NULL
を返します。これらの関数は数値と
文字列の両方で働きます。MySQL は比較がどのように行なわれるかを
決定するために、次の規則を使用します:
TIMESTAMP
または DATETIME
項目で、他の引数が
定数の場合は、定数は比較前に timestamp に変換されます。これはより ODBC
フレンドリにするためです。
どちらかまたは両方の引数が 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)
A
が NULL
なら 1 を、そうでなければ 0 を返します。
mysql> select isnull(1+1); -> 0 mysql> select isnull(1/0); -> 1
A BETWEEN B AND C
A
が B
以上かつ A
が C
以下。全ての引数が同
じ型の場合、(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,...)
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
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
は数値表現でも許されます!(拡張)
NOT (expr LIKE expr)
と同じです。
RLIKE
は mSQL
互換のためです。注意:
MySQL は文字列中で C エスケープ構文 (\n
) を使用するため、
REGEXP 文字列内で使用する '\'
は二重にする必要があります。
mysql> select 'Monty!' regexp 'm%y%%'; -> 0 mysql> select 'Monty!' regexp '.*'; -> 1 mysql> select 'new*\n*line' regexp 'new\\*.\\*line'
NOT (expr REGEXP expr)
と同じ。
mysql> select strcmp('text', 'text2'); -> -1 mysql> select strcmp('text2', 'text'); -> 1 mysql> select strcmp('text', 'text'); -> 0
IFNULL(A,B)
A
が NULL
でない場合は 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()
mysql> select sign(-32); -> -1 mysql> select sign(0); -> 0 mysql> select sign(234); -> 1
MOD()
%
mysql> select mod(234, 10); -> 4 mysql> select 253 % 7; -> 1 mysql> select mod(29,9); -> 2
FLOOR()
mysql> select floor(1.23); -> 1 mysql> select floor(-1.23); -> -2
CEILING()
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)
Number
を Decimals
桁の少数に丸めます。
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)
X
の Y
乗の値を返します。
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()
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)
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)
X
と Y
のアークタンジェントを返します。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.7888RAND() 値を持つ項目は ORDER BY できません。ORDER BY は項目を複数回評価す るためです。
MIN(X,Y...)
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...)
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)
Number
を Decimals
桁の少数に切り捨てます。
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 コード値を返します。S
が
NULL
の場合は NULL
を返します。
mysql> SELECT ascii(2); -> 50 mysql> SELECT ascii('dx'); -> 100
CHAR(X,...)
NULL
は飛ばされます。
mysql> SELECT char(77,121,83,81,'76'); -> 'MySQL'
CONCAT(X,Y...)
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)
B
の C
位置から、文字列 A
の位置を返します。
mysql> select locate('bar', 'foobarbar',5); -> 7
LEFT(str,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)
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)
A
の B
位置から C
文字の文字列を返します。
FROM
の違いは ANSI SQL 92 構文です。
mysql> select substring('Quadratically',5,6); -> ratica
SUBSTRING_INDEX(String, Delimiter, Count)
String
から、Delimiter
で Count
個に区切られた文字
列を返します。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
内の全ての文字列 B
を C
に置き換えます。
mysql> select replace('www.tcx.se', 'w', 'Ww'); -> 'WwWwWw.tcx.se'
REPEAT(String, Count)
String
を Count
回繰り返します。Count <= 0
の場合は
空の文字列を返します。String
または Count
が NULL
または、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)
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])
または、YYMMDD
や YYYYMMDD
の形式の数値です。
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])
または、HHMMSS
や YYYYMMDDHHMMSS
形式の数値です。
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)
mysql> select DAYOFMONTH('1998-02-03'); -> 3
DAYOFYEAR(date expr)
mysql> select DAYOFYEAR('1998-02-03'); -> 34
MONTH(date expr)
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)
mysql> select QUARTER('98-04-01'); -> 2
WEEK(date expr)
mysql> select WEEK('98-02-20'); -> 7
YEAR(date expr)
mysql> select YEAR('98-02-03'); -> 1998
HOUR(time expr)
mysql> select HOUR('10:05:03'); -> 10
MINUTE(time expr)
mysql> select MINUTE('98-02-03 10:05:03'); -> 5
SECOND(time expr)
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)
A
と B
の差の月を返します。A
と B
は形
式 YYMM
または YYYYMM
です。
mysql> select PERIOD_DIFF(9802,199703); -> 11
TO_DAYS(Date)
Date
を daynumber (0年からの日数) に変換します。Date
は
DATE
文字列、DATETIME
文字列、TIMESTAMP([6 | 8 |
14])
、YYMMDD
または YYYYMMDD
形式の数値です。
mysql> select TO_DAYS(9505); -> 733364 mysql> select TO_DAYS('1997-10-07); -> 729669
FROM_DAYS()
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 の将来のバージョン
では、%
は必要となります。
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()
が数値または文字列のどち
らの文脈で使用されたかに依存して YYYYMMDD
または
'YYYY-MM-DD'
です。
mysql> select CURDATE(); -> '1997-12-15' mysql> select CURDATE()+0; -> 19971215
HHMMSS
または 'HH:MM:SS'
の形式で返します。こ
れは CURTIME()
が数値または文字列のどちらの文脈で使用されたかに依
存します。
mysql> select CURTIME(); -> '23:50:20' mysql> select CURTIME()+0; -> 235026
NOW()
が数値または文字列のどちらの
文脈で使用されたかに依存して YYYYMMDDHHMMSS
または
'YYYY-MM-DD HH:MM:SS'
です。
mysql> select NOW(); -> '1997-12-15 23:51:26' mysql> select NOW()+0; -> 19971215235131
TIMESTAMP
項目を引数として呼び出し、項目
値を秒数で返します。Date
はローカル時刻での date 文字列、datetime
文字列、または YYMMDD または YYYYMMDD 形式の数値です。
mysql> select UNIX_TIMESTAMP(); -> 882226357 mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
YYYY-MM-DD HH:MM:SS
または
YYYYMMDDHHMMSS
形式の timestamp 文字列を返します。
mysql> select FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00'
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'
H:MM:SS
または HMMSS
形式で、引数の時, 分,
秒を返します。
mysql> select SEC_TO_TIME(2378); -> '00:39:38' mysql> select SEC_TO_TIME(2378)+0; -> 3938
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])
crypt()
コマンドで String
を暗号化します。
Salt
は2文字の文字列です。crypt()
が見使わない場合は常に
NULL
が返されます。
LAST_INSERT_ID()
mysql> select LAST_INSERT_ID(); -> 1
FORMAT(Nr, Num)
Num
桁)で数値 Nr
を整形
します。
mysql> select FORMAT(12332.33, 2); -> '12,332.33'
VERSION
mysql> select version(); -> '3.21.16-beta-log'
GET_LOCK(String,timeout)
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)
MIN(expr)
MAX(expr)
min()
と max()
が文字列引数を取ると、
最小/最大の文字列値を返します。
SUM(expr)
STD(expr)
STDDEV(expr) (Oracle format)
ANSI SQL
に対する拡張
です。
BIT_OR(expr)
OR
。64 ビットの精度で計算されます。
BIT_AND(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 database_name
データベースを与えられた名前で作成します。名前は文字、数字または
'_'
文字だけを含むことができ、文字または _
で始まらないと
いけません。データベース名の最大長は 64 文字です。MySQL 内の全
てのデータベースはディレクトリです。そのため、CREATE DATABASE は、
MySQL データベースディレクトリ内にディレクトリを作成するだけで
す。mysqladmin
でもデータベースを作成することができます。
「様々な MySQL プログラムの概要」節参照
DROP DATABASE database_name
データベース内の全てのテーブルを破棄し、データベースを削除します。この
コマンドはとても注意して行なってください! DROP DATABASE
はディ
レクトリからいくつのファイルが削除されたかを返します。通常これはテーブル数 * 3
です。mysqladmin
でもデータベースを破棄することができます。
「様々な MySQL プログラムの概要」節参照
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 は自動的にその項目にデフォルト値を割り当てます。
INT(5) ZEROFILL
は、値 5 は 00005
として取り出されます。
BINARY
は、その項目がケース依存で比較されることを意味します。デフォ
ルトは全ての文字列は ISO-8859-1 Latin1 に従ってケース非依存で比較されま
す。BINARY
は 'sticky' です。つまり、BINARY
とマークされた
項目が表現中で使われると、表現全体が BINARY
比較されます。
column_name(length)
構文では、string
項目の一部にだけイン
デックスを指定できます。これはインデックスファイルをとても小さくできます。
BLOB
と TEXT
型の制限」節参照 。
isamchk
ユーティリティをテー
ブルの再編成をするために使用できます。
VARCHAR
項目は CHAR
に変更されます。VARCHAR
項目が
一つ使用されると、2 より長い全ての CHAR
項目は VARCHAR
に
変更されます。これはどんな方法で項目を使用するかに影響しません;
MySQL では、VARCHAR
は文字を格納する方法が違うだけです。
領域を節約し、テーブルをより速くするために、MySQL
はこの変換を行
います。 「行形式の種類は? また VARCHAR/CHAR の使用時は?」節参照
INSERT
/UPDATE
では、全ての文字列(CHAR
と
VARCHAR
)は CREATE で与えられた最大長で切断または最大長まで埋めら
れます。終りの全ての空白も自動的に削除されます。例えば
VARCHAR(10)
は、項目は最大 10 文字の長さの文字列を含むことができま
す。
NULL
値になります。
REGEXP
と RLIKE
) はISO8859-1 (Latin1) を文字
の型の決定に使用します。
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
は次のように働きます。一時的なテーブルを作成し、全て
の情報をそこにコピーし、それから古いテーブルが削除され、新しいテーブルが
リネームされます。全ての更新は自動的に新しいテーブルにリダイレクトされる
ので、更新が失敗することなく行われます。ALTER TABLE
が動作中は、
古いテーブルは他のクライアントに読み込み可能です。テーブルの更新/テーブ
ルへの書き込みは止められ、新しいテーブルの準備ができた後にだけ実行されます。
IGNORE
が指定されない場合、新しいテーブル内に複数のユニークキーが
存在すると、コピーは失敗し巻き戻され(roll back)ます。重複する場合、最初
に見つかった行が使用されます。これは MySQL 拡張です。
CHANGE column_name
, DROP column_name
そして DROP
INDEX
は ANSI SQL92 への MySQL 拡張です。
COLUMN
は純粋にゴミの単語で、省略できます。
ADD
と CHANGE
は CREATE TABLE
と同じ
create_definition を使います。 「CREATE TABLE 構文」節参照 。
ADD
... AFTER
column_name または
FIRST
を使用して、テーブル内の位置を指定して項目を追加できます。
デフォルトは項目の最後です。
ALTER COLUMN
は項目に新しいデフォルト値を設定または古いデフォルト値
を削除します。
DROP INDEX
はインデックスを削除します。これは MySQL の拡
張です。
FOREIGN KEY
構文は互換のためだけに存在します。
「MySQL に無い機能」節参照
DROP PRIMARY KEY
は PRIMARY
と名付けられたインデックスを破
棄します。または、そのようなインデックスが存在しなければ、テーブルの最初
の UNIQUE
インデックスを破棄します。
CHANGE
はデータをできるだけ良い新しい形式に変換を試みます。
mysql_info(MYSQL*)
で、いくつのレコードがコピーされ、いくつのレコー
ドが複数インデックスのために削除されたかを取り出せます。
ALTER TABLE
を使用するためには、select, insert, delete, update,
create, drop 特権がテーブルに必要です。
ALTER TABLE table_name RENAME AS new_name
を他のオプション無しに
使用する場合は、MySQL はテーブルのリネームを速く行なうだけです。
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 table_name [, table_name...]
一つまたはそれ以上のテーブルを削除します。全てのデータと定義は削除され ます。このコマンドはそれを簡単に行ないます!
DELETE FROM table_name WHERE where_definition
影響されたレコード数を返します。
WHERE
節なしで削除を行った場合、テーブルが再生成されます。これは
各行を削除するよりもとても速いです。この場合、影響されたレコードは 0 と
してコマンドが返ります。MySQL は削除された行の数を返しません。
テーブル定義ファイル table_name.frm
が正しい限り、テーブルを再生
成できることを確かめるために、データファイルをオープンすることはなしに、
再生成が行われるためです。
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
HAVING
節内で使用できます。
select concat(last_name,' ',first_name) as name from table order by name
LEFT OUTER
JOIN
参照も含みます。 「Join 構文」節参照
LIKE
表現では、% と _ は '\' を前に置くことで、ワイルドカードの意
味をなくし、リテラルの % と _ になります。
IFNULL()
と IF()
は、使用に応じて数値または文字列値を返し
ます。
ORDER
と GROUP
の項目は、項目名, 項目別名 または SELECT
節内の項目番号として、与えられます。
HAVING
節は、select_expressions 中の任意の項目または別名を持つこと
ができます。最後に適用され、直前の項目がクライアントに最適化されずに送ら
れます。WHERE 節内に置くべき項目には使わないで下さい。次は(まだ)できませ
ん:
SELECT user,MAX(salary) FROM users GROUP BY user HAVING max(salary)>10
次のように変更して下さい:
SELECT user,MAX(salary) AS sum FROM users GROUP BY user HAVING sum > 10
STRAIGHT_JOIN
は、FROM
節で与えられた順番通りにテーブルを結合す
るように、オプティマイザに強制します。オプティマイザがテーブルを最適でない順に
結合する場合、より速く行なうクエリを得るためにこれを使用することができま
す。 「EXPLAIN 構文。SELECT についての情報を得る」節参照
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 構文です。
table_reference AS alias
または
table_reference alias
で別名をつけられます。
,
と JOIN
は意味的には同じです。これは使用されたテーブル間
の完全な結合を行います。通常は、テーブルをどのようにリンクするかを
WHERE
条件中で記述します。
ON
conditional は任意の WHERE
条件です。LEFT JOIN
の右のテーブルに適合するレコードがない場合、全ての項目が NULL に設定され
た行が右のテーブルとして使用されます。
USING
column-list は両方のテーブルに存在する項目のリストです。
A LEFT JOIN B USING (C1,C2,C3...)
は、意味的には ON
expression A.C1=B.C1 AND A.C2=B.C2 AND A.C3=B.C3...
と同じと定義
されます。
NATURAL LEFT JOIN
は意味的には、両方のテーブルに
存在する全ての項目名を持つ USING
と同じと定義されます。
LEFT JOIN
構文は ODBC との互換のためだけに存在します。
INSERT INTO table [ (column_name,...) ] VALUES (expression,...) or INSERT INTO table [ (column_name,...) ] SELECT ...
expression は column_name リスト(または column_name リストが与えられない 場合はテーブル)の前の項目を使用します。
次は、複数行の INSERT
ステートメントを保持します:
ORDER BY
節を含めることはできません。
INSERT
ステートメントのターゲットテーブルは、クエリの FROM 節に現れるこ
とができません。
INSERT INTO ... SELECT ...
を使用する場合、C API 関数
mysql_info()
で次の情報文字列を得ることができます。
Records: 100 Duplicates: 0 Warnings: 0
Duplicates はいくつかのイ
ンデックスが重複したために書き出されなかった行数です。Warnings は NOT
NULL と宣言されているのに NULL が設定された項目数です。これらはそのデフォ
ルト値が設定されます。
この場合、挿入しているのと同じテーブルからの SELECT は ANSI SQL で禁じら
れています。同じ実行で挿入された行を SELECT が見つける場合に、問題となり
ます。sub select 使用時には、状況は簡単にとても混乱します!
REPLACE INTO table [ (column_name,...) ] VALUES (expression,...) or REPLACE INTO table [ (column_name,...) ] SELECT ...
これは正確に INSERT
と似た動きをします。テーブル内に同じユニークキーを
持つ古いレコードがいくつかある場合に、古いレコード(一つまたは複数)がこの
レコードが挿入される前に削除されることが異なります。
「INSERT 構文」節参照 .
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
を使用する前に、可能ならば圧縮して rcp や
ftp でサーバにコピーしてください。テキストファイルへの全てのパ
スはデータベースディレクトリへの相対です。
テキストファイルにデータを書き込むには、
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 BY
と LINES TERMINATED BY
は1文字以上に
できます。
LINES TERMINATED BY
が空文字列で FIELDS TERMINATED BY
が空
でなければ、行も FIELDS TERMINATED BY
で終端されます。
FIELDS TERMINATED BY
と FIELDS 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 BY
と LINES TERMINATED BY
内の最初の
文字。
FIELDS ENCLOSED BY
が空でなければ、NULL
は NULL
値
として読まれます。FIELDS ESCAPED BY
が空でなければ \N
も
NULL
値として読まれます。
REPLACE
が使用されると、新しい行は同じユニークインデックスを持つ
全ての行を置き換えます。IGNORE
が使用されると、同じユニークキーを
持つレコードが既に存在していた場合、行はスキップされます。上記オプション
がなければエラーになります。重複インデックスのエラーになった場合、テキス
トファイルの残りは無視されます。
LOAD DATA
がサポートされないいくつかのケース:
FIELDS TERMINATED BY
と FIELDS ENCLOSED BY
の両方が空) と BLOB 項目。
FIELDS ESCAPED BY
が空で、データが LINES TERMINATED BY
ま
たは FIELDS TERMINATED BY
が続く FIELDS ENCLOSED BY
を含ん
でいる。
全ての行はテーブルに読み込まれます。行の項目が少ない場合は、残りの項目に
はデフォルト値が設定されます。TIMESTAMP
項目は、NULL 値がその列に
与えられた場合、または項目リストが使用された時に TIMESTAMP
項目が、
その項目リストにない場合に、現在の時刻を設定します (最後のケースでは、最
初の TIMESTAMP
項目だけを保持します)。
セキュリティ上の理由により、テキストファイルはデータベースディレクトリ内
にあるか全員に読み込み可能でなければいけません。LOAD DATA INFLIE
を使用したい各ユーザは、user 特権テーブルの 'File_priv' 項目も 'Y' でな
ければなりません! 「特権システムがどのように働くか?」節参照
LOAD DATA INFILE
は全ての入力を文字列としてみるため、enum
または set
項目には、INSERT
ステートメントで使用できるよう
には、数値は使用できません。全ての enum
と set
は文字列で
与えられる必要があります!
エスケープ構文についてのこれ以上の情報は 「リテラル。文字列と数値をどのように書くか?」節参照 。
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 table SET column=expression,... WHERE where_definition
全ての更新は左から右に行なわれます。expression 内で項目をアクセスすると、 更新は項目の現在の値(与えられた値またはデフォルト値)を使用します。
UPDATE persondata SET count=count+1
UPDATE
ステートメントはいくつの行が実際に変更されたかを返します。
MySQL 3.22 では mysql_info()
は適合した行数と更新された
行数と、更新中にいくつの警告を得たかを返します。
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 ワイルドカード (% と _)
です。FIELDS
は COLUMNS
の別名として使用され、KEYS
は INDEXES
の別名として使用されます。
STATUS
は、mysqladmin status
と同様に、サーバからのステー
タス情報を与えます。出力は次とは異なるかもしれません:
Uptime | Running_threads | Questions | Reloads | Open_tables
|
119 | 1 | 4 | 1 | 3 |
VARIABLES
は MySQL システム変数のいくつかの値を示します。
これらの変数の多くは、mysqld
への様々なオプションで変更できます!
EXPLAIN SELECT select_options
テーブルをどのようにどの順で結合するのかの情報を与えます。EXPLAIN
の助
けで、レコードを見つけるためにキーを使用するより速い select を得るために、
さらなるインデックスをテーブルに追加すべき時を見ることができます。また、オプティ
マイザが最適な順でテーブルを結合するかどうかを見ることもできます。select への
STRAIGHT_JOIN
オプションで、特定の結合順序の使用をオプティマイザ
に強制することができます。
様々な結合タイプ:
system
const
eq_ref
ref
range
all
これは 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.ActualPC
は char(10)
で et.EMPLOYID
は
char(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 | 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
を発行した時、またはサーバへの
接続がクローズされた場合、自動的にアンロックされます。
通常はテーブルをロックする必要はありません。とにかくテーブルをロックした い時にはいくつかの場合があります:
MySQL
はトランザクション環境をサポートしないため、他のスレッドが
読み込み都更新の間に来ないことを保証したい場合は、lock tables を使用する
必要があります。例えば前の例は安全のためには LOCK TABLES
を必要と
します! LOCK TABLES
を使用しない場合、SELECT と UPDATE ステート
メントの間に、誰かが新しい 'trans' 行を挿入する変更ができます。
UPDATE customer set value=value+new_value
) または
LAST_INSERT_ID() 関数の使用により、多くの場合 LOCK TABLES
を回避
できます。
いくつかの場合、ユーザレベルロック: GET_LOCK() と RELEASE_LOCK() の使用 によっても解決できます。これらのロックはサーバ内のハッシュテーブル内に保 持され、高速のため pthread_mutex で実装されました。 「その他の関数」節参照
SET [OPTION] SQL_VALUE_OPTION=value, ...
使用されたオプションは実際には現在のセッション全体に対して残ります。
様々なオプション:
SQL_SELECT_LIMIT=value
SQL_BIG_TABLES= 0 | 1
The table ### is full
になることはありません。
新しい接続のデフォルト値は 0 です(メモリ一時テーブルを使用します)。
SQL_BIG_SELECTS= 0 | 1
WHERE
ステー
トメントが発行された時に有用です。max_join_size
行以上を検討する
ような SELECT
が大きなクエリと定義されます。新しい接続のデフォル
ト値は 0 です(これは全ての SELECT を許します)。
CHARACTER SET character_set_name | DEFAULT
cp1251_koi8
だけですが、ファイル
mysql_source_directory/sql/convert.cc
を編集することにより、新し
いマッピングを簡単に追加できます。デフォルトマッピングを戻すには
character_set_name として DEFAULT
を使用します。
SQL_LOG_OFF= 0 | 1
TIMESTAMP= timestamp_value | DEFAULT
LAST_INSERT_ID= #
GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE, REFERENCES (column list), USAGE)) ON table TO user,... [WITH GRANT OPTION]
このコマンドは何も行ないません。これが MySQL にあるのは互換性の ためだけです。(他の SQL サーバからのコードの移行をより簡単にするため)。 MySQL の特権は MySQL 承認テーブルで操作されます。 「特権システムがどのように働くか?」節参照
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 < Patric1
と Pat <=
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 index_name
この関数はバージョン 3.22 より前の MySQL
では何も行いません。これ
は INDEX
または UNIQUE
定義を破棄する ALTER TABLE
呼び出しにマップされています。 「ALTER TABLE 構文」節参照
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 <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 にコピーしてください。
サンプル関数に関するいくつかの注意:
metaphon
は文字列引数の metaphon 文字列を返します。
これは soundex 文字列に似たものですが、さらに英語に tune されます。
myfunc_double
は、引数の全ての文字コードの合計を、全ての引数
の長さの合計で割った値を返します。
myfunc_int
は全ての引数の長さの合計を返します。
lookup
はホスト名の IP 番号を返します。
reverse_lookup
は IP 番号のホスト名を返します。
この関数は文字列 "xxx.xxx.xxx.xxx" または4桁の数値で呼ばれます。
ライブラリがインストールされた後、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 FUNCTION
と DROP FUNCTION
は func
テーブルを
更新します。全てのアクティブな関数はサーバの再起動ごとにリロードされます
(--skip-grant-tables が与えられない場合)。
よくある問題は、timestamp
や group
、MySQL に埋め
込まれているデータ型や関数の名前を項目名として持つテーブルの作成を試みる
ことをくいとめます。それを行なうことは許されています(例えば、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
|
Go to the first, previous, next, last section, table of contents.