minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

MySQLの演算子や関数について説明します。
なお、個人的に必要無いと思うものについては省略しています(笑)。
MySQL5.0.16対応

最初に

MySQLでは、数値⇔文字列の変換は自動的に行われます。

SELECT 100 + '200'           -> 300
SELECT 100 < '200'           -> 1 (TRUE)
SELECT 100 < '22'            -> 0 (FALSE)

比較演算子

比較演算の結果は、1(TRUE) / 0(FALSE) / NULL のいずれかになります。
例を挙げます。

SELECT 1 = 1          ->    1
SELECT 1 = 3          ->    0
SELECT 1 = NULL       ->    NULL
SELECT NULL = NULL    ->    NULL

最後の結果に注意して下さい。
どのデータベースにも共通して言えることですが、NULLという値は
特別な意味を持ちます。
NULL と比較する場合、後述する IS NULL<=> の構文を使う必要があります。
通常の比較演算子を用いた場合、NULLとの比較は比較対象の値に関わらず常にNULLとなります。

<=>

NULL対応の = 演算子です。

SELECT 1 <=> 1          ->    1
SELECT 1 <=> 3          ->    0
SELECT 1 <=> NULL       ->    0
SELECT NULL <=> NULL    ->    1

結果は、TRUE(1) / FALSE(0) のいずれかになります。NULLにはなり得ません。

IS NULL

値がNULLであるかどうかの比較をします。

SELECT 0 IS NULL          ->    0
SELECT 1 IS NULL          ->    0
SELECT NULL IS NULL       ->    1

AUTO_INCREMENT として定義されたカラムに対しては特殊な動作をします。

CREATE TABLE tbl_name (
  auto_col INTEGER AUTO_INCREMENT PRIMARY KEY,
  col1 CHAR(1)
);

上記のテーブルが定義されている場合を考えます。

INSERT INTO tbl_name (col1) values ('7');
SELECT auto_col FROM tbl_name WHERE auto_col IS NULL;

上のSQL文は、直前に挿入されたレコードを取得することが出来ます。
通常の解釈からすると、2行目のSQL文は何のレコードも取得できないように見えますが
これは特殊構文と解釈され、1行目で挿入されたレコード(のカラム)を返します。

IS NULL 構文はやや冗長な記述法なので、別の記述法も用意されています。
例えば、

SELECT a IS NULL

は以下の構文に置き換えることが出来ます。

SELECT ISNULL(a)

こちらの方がすっきりしていて見やすいです。

BETWEEN

値がある範囲にあるかどうかの比較をします。

SELECT 5 BETWEEN 0 AND 10                -> 1
SELECT 'b' BETWEEN 'a' AND 'c'           -> 1

IN

値が、指定した値(複数)のいずれかに存在するかどうかを返します。

SELECT 2 IN (0,1,2,3)                    -> 1
SELECT 10 IN (0,1,2,3)                   -> 0
SELECT * FROM tbl_name WHERE id IN (0,1,2)

INは別の文で置き換えることも出来ます。

A IN (0,1,2,3)

これは、次のSQL文と結果は同じ(常に同じかどうかは未確認)です。

(A = 0) OR (A = 1) OR (A = 2) OR (A = 3)

配列関係

COALESCE

配列中で最初の非NULL要素を返します。

SELECT COALESCE(NULL, NULL, 5)                    -> 5
SELECT COALESCE(NULL, NULL, NULL)                 -> NULL

INTERVAL

配列中のどの値の範囲にあるかを返します。

SELECT INTERVAL(N,N1,N2,...,Nn)

N<N1の場合は0、N<N2の場合は1、という感じになります。
N>Nnの場合はnを返します。

SELECT INTERVAL(-5,0,10,20)                      -> 0
SELECT INTERVAL(5,0,10,20)                       -> 1
SELECT INTERVAL(30,0,10,20)                      -> 3

値は全て整数である必要があります。

フロー制御

CASE

プログラム言語のcaseと同じです。

SELECT CASE 1
  WHEN 1 THEN "one"
  WHEN 2 THEN "two"
END
-> "one"

IF

プログラム言語のif-elseと同じです。

SELECT IF(2>1,
  "yes",
  "no")
-> "yes"

第1引数の結果がTRUEの場合、第2引数の値を返します。
FALSEの場合、第3引数の値を返します。

NULL関連

IFNULL

IFNULL(expr, default_value)

値(expr)がNULLの場合にデフォルト値(default_value)を返します。

SELECT IFNULL(NULL,0)     -> 0
SELECT IFNULL(2,0)        -> 2

expr がNULLでない場合は、expr をそのまま返します。
expr がNULLの場合は、default_value を返します。

NULLIF

NULLIF(expr1, expr2)

expr1 == expr2 の場合はNULLを返します。
それ以外の場合は、expr1 を返します。

文字列関数

ASCII

先頭文字のASCIIコード値を返します。

SELECT ASCII('012')   -> 48
SELECT ASCII('')      -> 0
SELECT ASCII(NULL)    -> NULL

BIN

整数の2進数表現を返します。

SELECT BIN(12)       -> '1100'

BIT_LENGTH

文字列の長さをビット単位で返します。

SELECT BIT_LENGTH('text')    -> 32
SELECT BIT_LENGTH('あ')      -> 16

CHAR

ASCII値の配列から文字列を生成して返します。

SELECT CHAR(77,121,83,81,76)        -> 'MySQL'

CHAR_LENGTH

CHARACTER_LENGTH

文字列の長さを文字数単位で返します。

SELECT CHAR_LENGTH('text')         -> 4
SELECT CHARACTER_LENGTH('あ')      -> 1

CONCAT

文字列を連結してその結果を返します。

SELECT CONCAT('My', 'S', 'QL')      -> 'MySQL'

CONCAT_WS

文字列を区切り文字で連結してその結果を返します。

SELECT CONCAT_WS(',', 'My', 'S', 'QL')      -> 'My,S,QL'

CONV

CONV(N, from_base, to_base)

数値を、進数の異なる表現で返します。

SELECT CONV('c',16,10)                -> 12
SELECT CONV(19,16,2)                  -> 11001

from_base 進数で表現された Nto_base 進数に変換します。

ELT

ELT(N, str1, str2, ..., strMAX)

Nの値によって異なる値を返します。
CASE と似ていますが、より簡略化されています。

SELECT ELT(1, 'one', 'two', 'three')                 -> 'one'
SELECT ELT(0, 'one', 'two', 'three')                 -> NULL

N が1だったら str1、2だったら str2 を返します。
N が1未満だったりMAXを超えている場合はNULLを返します。

FIELD

FIELD(str, str1, str2, ..., strMAX)

ELT と似ていますが、第一引数に文字列を指定するところが異なります。

SELECT FIELD('two', 'one', 'two', 'three')                 -> 2
SELECT FIELD('four', 'one', 'two', 'three')                -> 0

strstr1 と同じだったら1、str2 と同じだったら2を返します。
str と同じ文字列がstrNに見つからない場合は0を返します。

HEX

数値または文字列を16進数表現で返します。

SELECT HEX(255)                     -> 'FF'
SELECT HEX('abc')                   -> '616263'

引数が文字列の場合、各文字のASCIIコード値を16進数表現にして、それを連結した値を返します。

INSERT

INSERT(str, pos, len, replace_str)

文字列中の文字を置き換えます。

SELECT INSERT('abcdefg', 3, 2, '01234')         -> 'ab01234efg'
SELECT INSERT('abcde', 3, 0, '123')             -> 'ab123cde'

pos は挿入する文字位置(先頭は1)、len は置き換える文字数です。

INSTR

INSTR(str, find_str)

文字列中で最初に検索文字列が出現する位置を返します。

SELECT INSTR('0123456789', '45')             -> 5
SELECT INSTR('0123456789', '49')             -> 0

文字列が出現しなかった場合は0を返します。
INSTR関数は、LOCATE 関数に置き換えられます。引数の順序が逆になる事を注意して下さい。

LOCATE(find_str, str)

LEFT

LEFT(str, len)

文字列の先頭len文字を返します。

SELECT LEFT('0123456', 3)                 -> '012'
SELECT LEFT('0123', 6)                    -> '0123'

lenstr の文字列長より長い場合は str をそのまま返します。

RIGHT

LEFTの逆。文字列の後方len文字を返します。

SELECT RIGHT('0123456', 3)                 -> '456'
SELECT RIGHT('0123', 6)                    -> '0123'

LENGTH

文字列の長さをバイト数単位で返します。

SELECT LENGTH('text')                -> 4
SELECT LENGTH('あいう')              -> 6

LOCATE

LOCATE(find_str, str)
LOCATE(find_str, str, pos)

文字列中の指定位置(pos文字目)より後ろで、最初に検索文字列が出現する位置を返します。

SELECT LOCATE('45', '0123456789')            -> 5
SELECT LOCATE('abc', 'abc00abc', 3)          -> 6

pos は省略すると1(文字列の先頭から検索)になります。

LOWER

文字列を小文字に変換します。

SELECT LOWER('abcDEF')                -> 'abcdef'

UPPER

文字列を大文字に変換します。

SELECT LOWER('abcDEF')                -> 'ABCDEF'

LPAD

LPAD(str, len, padding_str)

文字列長が一定の長さになるまで、文字列の左側を指定文字で埋めます。

SELECT LPAD('123', 5, '0')                -> '00123'
SELECT LPAD('123456', 5, '0')             -> '12345'

文字列長が len より長い場合には、文字列の右側が切り捨てられます。

RPAD

LPAD の逆で、文字列の右側を指定文字で埋めます。

SELECT RPAD('123', 5, '0')                -> '12300'
SELECT RPAD('123456', 5, '0')             -> '12345'

LTRIM

文字列の左側にある空白文字を削除します。

SELECT LTRIM('  123')                   -> '123'

RTRIM

文字列の右側にある空白文字を削除します。

SELECT LTRIM('123  ')                   -> '123'

TRIM

任意の文字列をトリミング(削除)します。

TRIM(str) 
TRIM([BOTH | LEADING | TRAILING] [remstr] FROM str) 

引数が一つの場合は、LTRIMRTRIM の両方を適用した場合と同じ結果になります。
BOTH は省略したときのデフォルト値、
LEADING は LTRIM と同じ、TRAILING は RTRIM と同じになります。
remstr は、削除対象の文字で省略すると空白文字(半角スペース)になります。

SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx')        -> 'barxxx'
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz')       -> 'barx'

OCT

数値を8進数表現で返します。

SELECT OCT(100)                 -> '144'

QUOTE

文字列をSQLエスケープして返します。

SELECT QUOTE("Don't")                 -> 'Don\'t!'

返される文字列は引用符(シングルクォーテーション)で囲まれています。

REPEAT

文字列を指定した回数だけ繰り返して返します。

SELECT REPEAT('ab', 3)                     -> 'ababab'

REPLACE

REPLACE(str, from_str, to_str)

文字列中に現れる文字列from_strの全てをto_strで置き換えます。

SELECT REPLACE('012012', '0', 'xx')             -> 'xx12xx12'

REVERSE

文字列を逆さにして返します。

SELECT REVERSE('abcde')                -> 'edcba'

SPACE

SPACE(n)

n文字の空白文字を返します。

SELECT SPACE(6)                        -> '      '

SUBSTRING

SUBSTRING(str, pos)
SUBSTRING(str, pos, len)

部分文字列を返します。

SELECT SUBSTRING('0123456789', 4)              -> '3456789'
SELECT SUBSTRING('0123456789', 4, 3)           -> '345'

len が省略された場合は、pos文字目以降の全ての文字列を返します。

SUBSTRING_INDEX

SUBSTRING_INDEX(str, delimiter, count)

文字列中の、指定された区切り文字がcount番目に現れた箇所より前(後)の文字列を返します。

SELECT SUBSTRING_INDEX('0:1:2:3:4', ':', 2)         -> '0:1'
SELECT SUBSTRING_INDEX('0:1:2:3:4', ':', -3)        -> '2:3:4'

count が正数の場合は左端から区切り文字を検索し、見つかった箇所より前の文字列を返します。
count が負数の場合は右端から区切り文字を検索し、見つかった箇所より後の文字列を返します。

文字列比較関数

LIKE

expr LIKE pattern
expr LIKE pattern ESCAPE escape_char

簡易正規表現を用いて文字列を比較します。
エスケープ文字escape_charは、省略すると '\' になります。
「%」は任意の文字列(正規表現の.*)、「_」は任意の1文字(正規表現の.)と一致します。

SELECT '01234' LIKE '01%'                    -> 1
SELECT '01234' LIKE '01___'                  -> 1
SELECT '01234' LIKE '01__'                   -> 0
SELECT '01234_' LIKE '01234\_'               -> 1
SELECT '01234_' LIKE '01234|_' ESCAPE '|'    -> 1

LIKEは数値式でも利用できます。

SELECT 123000 LIKE '123%'                    -> 1

REGEXP

プログラマにとって嬉しいのがこの機能ですね。
MySQLでは(簡易ではない)正規表現を使うことが出来ます。

SELECT '0123' REGEXP '01.*'                  -> 1

STRCMP

文字列を比較して、-1 / 0 / 1 のいずれかを返します。

SELECT STRCMP('a', 'b')                      -> -1
SELECT STRCMP('b', 'b')                      -> 0
SELECT STRCMP('b', 'a')                      -> 1

BINARY

文字列をバイナリ文字列にキャストします。

数値関数

全ての数値関数は、エラーが発生すると NULL を返します。

ABS

ABS(n)

数値の絶対値を返します。

CRC32

MySQL4.1.0以降で利用できます。
文字列のCRC32値(符号なし32ビット)を返します。

PI

PI()

πの値を返します。

RAND

RAND()
RAND(N)

0 〜 1.0 の範囲でランダム値を生成して返します。
引数(整数)を指定すると、その値に基づいたランダム値が返されます。
この場合、同じ N ならばその結果は常に等しくなります。

RAND()                      -> 0.85110556972316
RAND()                      -> 0.69612415106606
RAND(3)                     -> 0.90576975597606
RAND(3)                     -> 0.90576975597606

SIGN

数値が「負数 / 0 / 正数」のいずれに属するかを返します。
返される値はそれぞれ、 -1 / 0 / 1 になります。

SELECT SIGN(100)                      -> 1
SELECT SIGN(-50)                      -> -1

DIV

MySQL4.1.0以降で利用できます。
除算の商を返します。

SELECT 75 DIV 10               -> 7

EXP

EXP(n)

eの n 乗を返します。
eとは自然対数の底を表します。

SELECT EXP(3)                  -> 20.085537

GREATEST

MAX

配列で与えた値の中で最大のものを返します。
MySQL3.22.5以前では MAX、それ以降のバージョンでは GREATEST を使用できます。

SELECT GREATEST(10, 100, 50)              -> 100
SELECT MAX('AB', 'BA', 'AZ')              -> 'BA'

LEAST

GREATEST の逆です。値の中で最小のものを返します。

LOG

LOG(n)

n の自然対数を返します(底はe)。

LOG(n, B)

B を底とする n の自然対数を返します。

LN

LOG のシノニム(別名)です。

LOG2

LOG10

それぞれ 2 , 10 を底とした自然対数を返します。

MOD

割った余りを返します。

SELECT MOD(234, 10)           -> 4

POW

POWER

POW(x,y)

xy 乗を返します。

SELECT POW(2,8)                       -> 256

SQRT

数値の平方根を返します。

SELECT SQRT(9)                        -> 3

COS

数値のコサイン値を返します。

ACOS

数値のアークコサイン値を返します。

COT

数値のコタンジェント値を返します。

ASIN

数値のアークサイン値を返します。

TAN

数値のタンジェント値を返します。

ATAN

ATAN(n)

数値のアークタンジェント値を返します。

ATAN(Y,X)

2つの変数 X と Y のアークタンジェントを返します。

CEIL

CEILING

CEIL(X)

X 以上の最も小さい整数値を返します。

SELECT CEILING(1.5)               -> 2
SELECT CEIL(-1.5)                 -> -1

FLOOR

X 以下の最も大きい整数値を返します。

SELECT CEILING(1.5)               -> 1
SELECT CEIL(-1.5)                 -> -2

ROUND

ROUND(n)
ROUND(n, scale)

数値を最も近い整数に丸めた値を返します。
引数scaleを指定した場合は、小数桁数をscaleにして丸めます。

SELECT ROUND(1.4)                     -> 1
SELECT ROUND(1.8)                     -> 2
SELECT ROUND(1.1874, 2)               -> 1.19
SELECT ROUND(1.5)                     -> 1

なお、最後の例は環境によって結果が異なる可能性があります。

TRUNCATE

TRUNCATE(n, scale)

数値の小数桁数scaleにして切り捨てた値を返します。

SELECT TRUNCATE(1.8, 0)               -> 1
SELECT TRUNCATE(1.899, 2)             -> 1.89

DEGREES

数値をラジアン単位から度単位に変換します。

SELECT DEGREES(PI())           -> 180

RADIANS

DEGREES の逆です。数値を度単位からラジアン単位に変換します。

日付関数

ADDDATE

SUBDATE

ADDDATE(date,INTERVAL expr type)

日付を加算した結果を返します。
date には基準となる日付、type には加算する単位(DAYなど)、
expr には加算する数値を指定します。

SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY) -> '1998-02-02'

typeに指定できる単位は以下の通りです。

以下のtypeは、MySQL4.1.1以降で利用できます。

ADDTIME

SUBTIME

MySQL4.1.1以降で利用できます。

ADDTIME(expr, expr2)

時刻を加算した結果を返します。
expr には基準となる日付または日付時刻式を指定し、
expr2 には加算する時刻式を指定します。

SELECT ADDTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002")
      -> '1998-01-02 01:01:01.000001'

CURDATE

CURRENT_DATE

現在の日付を返します。

SELECT CURDATE()      -> '1997-12-15'

CURTIME

CURRENT_TIME

現在の時刻を返します。

SELECT CURTIME()      -> '23:50:26'

NOW

CURRENT_TIMESTAMP

LOCALTIME

LOCALTIMESTAMP

SYSDATE

現在の日付時刻を返します。
使われた文脈(コンテキスト)によって、文字列形式または数値形式で値を返します。

SELECT NOW()          -> '1997-12-15 23:50:26'
SELECT NOW() + 0      -> 19971215235026

DATE

MySQL4.1.1以降で利用できます。
日付部分を取り出します。

SELECT DATE('2003-12-31 01:02:03')  -> '2003-12-31'

TIME

MySQL4.1.1以降で利用できます。
時刻部分を取り出します。

SELECT TIME('2003-12-31 01:02:03')   -> '01:02:03'

DATEDIFF

MySQL4.1.1以降で利用できます。
2つの日付の差を日数単位で返します。

SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30') -> 1

DATE_ADD

DATE_SUB

DATE_ADD(date,INTERVAL expr type)

ADDDATE と同じです。

DATE_FORMAT

日付時刻を文字列形式にフォーマットします。

DATE_FORMAT(date, format)

format には以下の指定子を使用できます(一部省略)。

%M

月の名前(January...)

%W

曜日名(Sunday...)

%D

英語のサフィックス付きの日付(0th...)

%Y

4桁の数値で表した年。

%y

2桁の数値で表した年。

%a

略式の曜日名(Sun...)

%d

数値で表した日付(00..31)

%e

数値で表した日付(0..31)

%m

数値で表した月(00..12)

%c

数値で表した月(0..12)

%b

略式の月名(Jan...)

%j

年間を通した日にち(001..366)

%H

時(00..23)

%k

時(0..23)

%H

午前または午後の時(01..12)

%I
%l

午前または午後の時(1..12)

%i

分 (00..59)

%r

12時間形式の時刻(hh:mm:ss に続けて AM または PM)

%t

24時間形式の時刻(hh:mm:ss)

%S
%s

秒(00..59)

%f

MySQL4.1.1以降。マイクロ秒(000000..999999)

%p

AM または PM

%w

曜日(0=Sunday..6=Saturday)

%%

% のエスケープ表記

例を挙げます。

SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i:%s') -> '2004/10/29 12:16:31'

STR_TO_DATE

DATE_FORMAT の逆の働きをします。
文字列を指定されたフォーマットで解析して、日付時刻型で返します。

SELECT STR_TO_DATE('03.10.2003 09.20', '%d.%m.%Y %H.%i')
      -> 2003-10-03 09:20:00

TIME_FORMAT

DATE_FORMAT とほぼ同じですが、フォーマット文字列には
時・分・秒に関する形式指定子のみ指定できます。

SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l')
      -> '100 100 04 04 4'

DAY

DAYOFMONTH

指定された日付の日(1~31)を返します。
DAY はMySQL4.1.1以降で利用できるシノニム(別名)です。

SELECT DAYOFMONTH('1998-02-03')     -> 3

DAYNAME

指定された日付の曜日名を返します。

SELECT DAYNAME('1998-02-05')        -> 'Thursday'

DAYOFWEEK

指定された日付の曜日インデックス(1: 日曜 ~ 7:土曜)を返します。

SELECT DAYOFWEEK('1998-02-03')      -> 3

DAYOFWEEK

指定された日付に対し、年間を通した日にち(1~366)を返します。

SELECT DAYOFYEAR('1998-02-03')      -> 34

HOUR

指定された時刻の時を返します。

SELECT HOUR('10:05:03')       -> 10

なお、MySQLでは時刻(TIME)値として実在しない時間を表すことも可能です。
例えば、以下のような使い方も出来ます。

SELECT HOUR('272:59:59')      -> 272

MICROSECOND

MySQL4.1.1以降で利用できます。
指定した時刻のマイクロ秒(0~999999)を返します。

SELECT MICROSECOND('12:00:00.123456')   -> 123456

MINUTE

指定された時刻の分を返します。

SELECT MINUTE('98-02-03 10:05:03')       -> 5

MONTH

指定された日付の月を返します。

SELECT MONTH('1998-02-03')               -> 2

MONTHNAME

指定された日付の月の名前を返します。

SELECT MONTHNAME('1998-02-05')           -> 'February'

QUARTER

指定された日付の四半期を、1~4の値で返します。

SELECT QUARTER('98-04-01')               -> 2

SECOND

指定された日付の秒を返します。

SELECT SECOND('10:05:03')                -> 3

WEEK

指定された日付に対応する週の数を返します。

SELECT WEEK('1998-02-20')      -> 7

MySQL4.0以降では、追加引数により戻り値の範囲などを変更できますが
詳細は不明です。

WEEKDAY

指定された日付の曜日インデックス(0: 月曜 ~ 6:日曜)を返します。
DAYOFWEEK と似ていますが、曜日インデックスの割り振り方が異なります。

SELECT WEEKDAY('1998-02-03 22:23:00')        -> 1

WEEKOFYEAR

指定された日付のカレンダ上の週(1~53)を返します。

SELECT WEEKOFYEAR('1998-02-20')        -> 8

YEAR

指定された日付の年を返します。

SELECT YEAR('98-02-03')                 -> 1998

EXTRACT

EXTRACT(type FROM date)

指定された日付の一部を抽出します。
type は、ADDDATE で使用できる型と同じです。

SELECT EXTRACT(YEAR FROM "1999-07-02")     -> 1999

FROM_DAYS

FROM_DAYS(N)

ある日付から N 日分経過した日付を返します。
「ある日付」の具体的な年月日は不明です。
この関数は、ある日付にユニークな1次元の数値を割り当てたいとき等に使用します。
N という数値は特別な意味を持っていません。

SELECT FROM_DAYS(729669) -> '1997-10-07'

FROM_UNIXTIME

FROM_UNIXTIME(unix_timestamp)

指定したタイムスタンプ値を日付に変換して、文字列もしくは数値で返します。
どちらで返されるかは、文脈(コンテキスト)によって判断されます。

SELECT FROM_UNIXTIME(875996580) -> '1997-10-04 22:23:00'
SELECT FROM_UNIXTIME(875996580) + 5 -> 19971004222305

タイムスタンプ値とは、1970年1月1日からの経過秒数です。
文字列のフォーマットを指定する場合は以下のようにします。

FROM_UNIXTIME(unix_timestamp, format)

format の書式は DATE_FORMAT と同じです。

GET_FORMAT

MySQL4.1.1以降で利用できます。
フォーマットの文字列を返します。詳細は不明です。

LAST_DAY

MySQL4.1.1以降で利用できます。
指定された日付が含む月の、最後の日にちを返します。

SELECT LAST_DAY('2004-02-05')       -> '2004-02-29'

MAKE_DATE

MySQL4.1.1以降で利用できます。

MAKEDATE(year, day_of_year)

year 年の1月1日から数えて day_of_year 日目の日付を返します。
day_of_year は1以上の値を指定する必要があります。

SELECT MAKEDATE(2001,31)            -> '2001-01-31'

MAKE_TIME

MySQL4.1.1以降で利用できます。

MAKE_TIME(hour, minute, second)

引数で指定した時・分・秒から生成した時刻を返します。

SELECT MAKETIME(12,15,30)           -> '12:15:30'

SEC_TO_TIME

指定した秒数を「HH:MM:SS」形式で返します。

SELECT SEC_TO_TIME(2378)          -> '00:39:38'

TIMEDIFF

MySQL4.1.1以降で利用できます。

TIMEDIFF(expr, expr2)

2つの時刻の差を返します。

SELECT TIMEDIFF('1997-12-31 23:59:59','1997-12-30 01:01:01')
      -> '46:58:58'

TIMESTAMP

指定した日付または日付時刻値を日付時刻値として返します。

SELECT TIMESTAMP('2003-12-31')      -> '2003-12-31 00:00:00'

TIME_TO_SEC

指定された時刻を秒数に変換して返します。

SELECT TIME_TO_SEC('22:23:00')        -> 80580

TO_DAYS

指定された日付を日数(年 0 からの通し日数)に変換して返します。

SELECT TO_DAYS('1997-10-07')          -> 729669

UNIX_TIMESTAMP

指定された日付のタイムスタンプ値を返します。
タイムスタンプ値とは、1970年1月1日からの経過秒数です。
引数を省略した場合は、現在時刻のタイムスタンプ値を返します。

SELECT UNIX_TIMESTAMP()        -> 882226357

UTC_DATE

MySQL4.1.1以降で利用できます。
現在日付を文字列または数値で返します。

SELECT UTC_DATE()              -> '2003-08-14'

UTC_TIME

MySQL4.1.1以降で利用できます。
現在時刻を文字列または数値で返します。

SELECT UTC_DATE()              -> '18:07:53'

UTC_TIMESTAMP

MySQL4.1.1以降で利用できます。
現在日付時刻を文字列または数値で返します。

SELECT UTC_DATE()              -> '2003-08-14 18:08:04'

キャスト関数

調査中…

その他の関数

AES_ENCRYPT

AES_DECRYPT

MySQL4.0.2以降で利用できます。
AES(Advanced Encryption Standard)アルゴリズムで
データの暗号化/解読を行います。

INSERT INTO t VALUES (AES_ENCRYPT('text', 'password'))

上の例では、文字列 textpassword により暗号化しています。
この関数は、現在MySQLで利用できる最も安全性の高い暗号化関数だそうです。

BENCHMARK

MySQLのベンチマークを計測します。

SELECT BENCHMARK(1000000, ENCODE('hello', 'goodbye'))

上の例では、ENCODE関数を1000000回繰り返して実行します。
結果の値は常に0が返ります。
どこがベンチマーク関数なのかと思うかもしれませんが、
実際のSQL実行時間はクライアント側で測ってくれという事らしいです。
もっとも、それなりのクライアントを使っていれば
SQL文の実行時間くらいは表示されるはずです。

REPEAT関数と言った方がわかりやすいかもしれませんね。

COMPRESS

MySQL4.1.1以降で利用できます。
文字列を圧縮します。
圧縮後の結果は、CHARやVARCHARでなくBLOB型カラムへ格納するよう推奨されています。

SELECT LENGTH(COMPRESS('aaaaaaaaaaaaaaaaaaaaaaaa'))

CONNECTION_ID

現在の接続IDを返します。

CURRENT_USER

現在接続中のユーザ名およびホスト名を返します。

SELECT CURRENT_USER()        -> 'limy@localhost'

DATABASE()

カレントデータベース名を返します。

カレントデータベースが無い場合、MySQL4.1.1以降ではNULLを返しますが
それ以前のバージョンでは空文字列を返します。

DECODE

ENCODE

文字列の暗号化/解読を行います。

DES_DECRYPT

DES_ENCRYPT

Triple-DESアルゴリズムによって文字列の暗号化/解読を行います。

ENCRYPT

Unixのcrypt()システムコールを利用して文字列を暗号化します。