国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL 4.1.0 中文參考手冊 --- 6.3 用于 select 和 where 子句的函

2024-07-24 12:54:50
字體:
來源:轉載
供稿:網友
mysql 4.1.0 中文參考手冊 --- 犬犬(心帆)翻譯 mysql reference manual for version 4.1.0-alpha.

6.3.4 日期和時間函數


對于每個類型的值范圍以及日期和時間值有效指定格式,請查看章節 6.2.2 date 和 time 類型。

這里是一個使用日期函數的例子。下面的查詢選擇所有 date_col 值在最后 30 天內的記錄。

mysql> select something from tbl_name where to_days(now()) - to_days(date_col) <= 30;
dayofweek(date) 返回 date 的星期索引(1 = sunday, 2 = monday, ... 7 =saturday)。索引值符合 odbc 的標準。
mysql> select dayofweek('1998-02-03'); -> 3
weekday(date)返回 date 的星期索引(0 = monday, 1 = tuesday, ... 6 = sunday):
mysql> select weekday('1998-02-03 22:23:00'); -> 1mysql> select weekday('1997-11-05'); -> 2
dayofmonth(date)返回 date 是一月中的第幾天,范圍為 1 到 31:
mysql> select dayofmonth('1998-02-03'); -> 3
dayofyear(date)返回 date 是一年中的第幾天,范圍為 1 到 366:
mysql> select dayofyear('1998-02-03'); -> 34
month(date)返回 date 中的月份,范圍為 1 到 12:
mysql> select month('1998-02-03'); -> 2
dayname(date)返回 date 的星期名:
mysql> select dayname("1998-02-05"); -> 'thursday'
monthname(date)返回 date 的月份名:
mysql> select monthname("1998-02-05"); -> 'february'
quarter(date)返回 date 在一年中的季度,范圍為 1 到 4:
mysql> select quarter('98-04-01'); -> 2
week(date)week(date,first)對于星期日是一周中的第一天的場合,如果函數只有一個參數調用,返回 date 為一年的第幾周,返回值范圍為 0 到 53 (是的,可能有第 53 周的開始)。兩個參數形式的 week() 允許你指定一周是否以星期日或星期一開始,以及返回值為 0-53 還是 1-52。這里的一個表顯示第二個參數是如何工作的:值 含義 0 一周以星期日開始,返回值范圍為 0-531 一周以星期一開始,返回值范圍為 0-532 一周以星期日開始,返回值范圍為 1-533 一周以星期一開始,返回值范圍為 1-53 (iso 8601)
mysql> select week('1998-02-20'); -> 7mysql> select week('1998-02-20',0); -> 7mysql> select week('1998-02-20',1); -> 8mysql> select week('1998-12-31',1); -> 53
注意,在版本 4.0 中,week(#,0) 被更改為匹配 usa 歷法。注意,如果一周是上一年的最后一周,當你沒有使用 2 或 3 做為可選參數時,mysql 將返回 0:
mysql> select year('2000-01-01'), week('2000-01-01',0); -> 2000, 0mysql> select week('2000-01-01',2); -> 52
你可能會爭辯說,當給定的日期值實際上是 1999 年的第 52 周的一部分時,mysql 對 week() 函數應該返回 52。我們決定返回 0 ,是因為我們希望該函數返回“在指定年份中是第幾周”。當與其它的提取日期值中的月日值的函數結合使用時,這使得 week() 函數的用法可靠。如果你更希望能得到恰當的年-周值,那么你應該使用參數 2 或 3 做為可選參數,或者使用函數 yearweek() :
mysql> select yearweek('2000-01-01'); -> 199952mysql> select mid(yearweek('2000-01-01'),5,2); -> 52
year(date)返回 date 的年份,范圍為 1000 到 9999:
mysql> select year('98-02-03'); -> 1998
yearweek(date)yearweek(date,first)返回一個日期值是的哪一年的哪一周。第二個參數的形式與作用完全與 week() 的第二個參數一致。注意,對于給定的日期參數是一年的第一周或最后一周的,返回的年份值可能與日期參數給出的年份不一致:
mysql> select yearweek('1987-01-01'); -> 198653
注意,對于可選參數 0 或 1,周值的返回值不同于 week() 函數所返回值(0), week() 根據給定的年語境返回周值。hour(time)返回 time 的小時值,范圍為 0 到 23:
mysql> select hour('10:05:03'); -> 10
minute(time)返回 time 的分鐘值,范圍為 0 到 59:
mysql> select minute('98-02-03 10:05:03'); -> 5
second(time)返回 time 的秒值,范圍為 0 到 59:
mysql> select second('10:05:03'); -> 3
period_add(p,n)增加 n 個月到時期 p(格式為 yymm 或 yyyymm)中。以 yyyymm 格式返回值。注意,期間參數 p 不是 一個日期值:
mysql> select period_add(9801,2); -> 199803
period_diff(p1,p2)返回時期 p1 和 p2 之間的月數。p1 和 p2 應該以 yymm 或 yyyymm 指定。注意,時期參數 p1 和 p2 不是 日期值:
mysql> select period_diff(9802,199703); -> 11
date_add(date,interval expr type)date_sub(date,interval expr type)adddate(date,interval expr type)subdate(date,interval expr type)這些函數執行日期的算術運算。adddate() 和 subdate() 分別是 date_add() 和 date_sub() 的同義詞。在 mysql 3.23 中,如果表達式的右邊是一個日期值或一個日期時間型字段,你可以使用 + 和 - 代替 date_add() 和 date_sub()(示例如下)。參數 date 是一個 datetime 或 date 值,指定一個日期的開始。expr 是一個表達式,指定從開始日期上增加還是減去間隔值。expr 是一個字符串;它可以以一個 “-” 領頭表示一個負的間隔值。type 是一個關鍵詞,它標志著表達式以何格式被解釋。下表顯示 type 和 expr 參數是如何關聯的:type 值 expr 期望的格式second secondsminute minuteshour hoursday daysmonth monthsyear yearsminute_second "minutes:seconds"hour_minute "hours:minutes"day_hour "days hours"year_month "years-months"hour_second "hours:minutes:seconds"day_minute "days hours:minutes"day_second "days hours:minutes:seconds"在 expr 的格式中,mysql 允許任何字符作為定界符。表中所顯示的是建議的定界字符。如果 date 參數是一個 date 值,并且計算的間隔僅僅有 year、month 和 day 部分(沒有時間部分),那么返回值也是一個 date 值。否則返回值是一個 datetime 值:
mysql> select "1997-12-31 23:59:59" + interval 1 second; -> 1998-01-01 00:00:00mysql> select interval 1 day + "1997-12-31"; -> 1998-01-01mysql> select "1998-01-01" - interval 1 second; -> 1997-12-31 23:59:59mysql> select date_add("1997-12-31 23:59:59", -> interval 1 second); -> 1998-01-01 00:00:00mysql> select date_add("1997-12-31 23:59:59", -> interval 1 day); -> 1998-01-01 23:59:59mysql> select date_add("1997-12-31 23:59:59", -> interval "1:1" minute_second); -> 1998-01-01 00:01:00mysql> select date_sub("1998-01-01 00:00:00", -> interval "1 1:1:1" day_second); -> 1997-12-30 22:58:59mysql> select date_add("1998-01-01 00:00:00", -> interval "-1 10" day_hour); -> 1997-12-30 14:00:00mysql> select date_sub("1998-01-02", interval 31 day); -> 1997-12-02
如果你指定了一個太短的間隔值(沒有包括 type 關鍵詞所期望的所有間隔部分),mysql 假設你遺漏了間隔值的最左邊部分。例如,如果指定一個 type 為 day_second,那么 expr 值被期望包含天、小時、分鐘和秒部分。如果你象 "1:10" 樣指定一個值,mysql 假設天和小時部分被遺漏了,指定的值代表分鐘和秒。換句話說,"1:10" day_second 被解釋為等價于 "1:10" minute_second。這類似于 mysql 解釋 time 值為經過的時間而不是一天的時刻。注意,如果依著包含一個時間部分的間隔增加或減少一個日期值,該日期值將被自動地轉換到一個日期時間值:
mysql> select date_add("1999-01-01", interval 1 day); -> 1999-01-02mysql> select date_add("1999-01-01", interval 1 hour); -> 1999-01-01 01:00:00
如果你使用了確定不正確的日期,返回結果將是 null。如果你增加 month、year_month 或 year,并且結果日期的天比新月份的最大天數還大,那么它將被調整到新月份的最大天數:
mysql> select date_add('1998-01-30', interval 1 month); -> 1998-02-28
注意,上面的例子中,單詞 interval 和關鍵詞 type 是不區分字母大小寫的。

extract(type from date)extract() 函數使用與 date_add() 或 date_sub() 一致的間隔類型,但是它用于指定從日期中提取的部分,而不是進行日期算術運算。
mysql> select extract(year from "1999-07-02"); -> 1999mysql> select extract(year_month from "1999-07-02 01:02:03"); -> 199907mysql> select extract(day_minute from "1999-07-02 01:02:03"); -> 20102
to_days(date)給出一個日期 date,返回一個天數(從 0 年開始的天數):
mysql> select to_days(950501); -> 728779mysql> select to_days('1997-10-07'); -> 729669
to_days() 無意于使用先于格里高里歷法(即現行的陽歷)(1582)出現的值,因為它不考慮當歷法改變時所遺失的天數。

from_days(n)給出一個天數 n,返回一個 date 值:
mysql> select from_days(729669); -> '1997-10-07'
from_days() 無意于使用先于格里高里歷法(1582)出現的值,因為它不考慮當歷法改變時所遺失的天數。

date_format(date,format)依照 format 字符串格式化 date 值。下面的修飾符可被用于 format 字符串中:修飾符 含義 %m 月的名字 (january..december)%w 星期的名字 (sunday..saturday)%d 有英文后綴的某月的第幾天 (0th, 1st, 2nd, 3rd, etc.)%y 年份,數字的,4 位%y 年份,數字的,2 位 %x 周值的年份,星期日是一個星期的第一天,數字的,4 位,與 '%v' 一同使用%x 周值的年份,星期一是一個星期的第一天,數字的,4 位,與 '%v' 一同使用%a 縮寫的星期名 (sun..sat)%d 月份中的天數,數字的 (00..31)%e 月份中的天數,數字的 (0..31)%m 月,數字的 (00..12)%c 月,數字的 (0..12)%b 縮寫的月份名 (jan..dec)%j 一年中的天數 (001..366)%h 小時 (00..23)%k 小時 (0..23)%h 小時 (01..12)%i 小時 (01..12)%l 小時 (1..12)%i 分鐘,數字的 (00..59)%r 時間,12 小時 (hh:mm:ss [ap]m)%t 時間,24 小時 (hh:mm:ss)%s 秒 (00..59)%s 秒 (00..59)%p am 或 pm%w 一周中的天數 (0=sunday..6=saturday)%u 星期 (00..53),星期日是一個星期的第一天%u 星期 (00..53),星期一是一個星期的第一天%v 星期 (01..53),星期日是一個星期的第一天。與 '%x' 一起使用%v 星期 (01..53),星期一是一個星期的第一天。與 '%x' 一起使用%% 一個字母 “%”所有其它的字符不經過解釋,直接復制到結果中:
mysql> select date_format('1997-10-04 22:23:00', '%w %m %y'); -> 'saturday october 1997'mysql> select date_format('1997-10-04 22:23:00', '%h:%i:%s'); -> '22:23:00'mysql> select date_format('1997-10-04 22:23:00', '%d %y %a %d %m %b %j'); -> '4th 97 sat 04 10 oct 277'mysql> select date_format('1997-10-04 22:23:00', '%h %k %i %r %t %s %w'); -> '22 22 10 10:23:00 pm 22:23:00 00 6'mysql> select date_format('1999-01-01', '%x %v'); -> '1998 52'
在 mysql 3.23 中,在格式修飾符前需要字符 `%'。在更早的 mysql 版本中,`%' 是可選的。月份與天修飾符的范圍從零開始的原因是,在 mysql 3.23 中,它允許存儲不完善的日期值(例如 '2004-00-00')。

time_format(time,format)它的使用方法與上面的 date_format() 函數相似,但是 format 字符串只包含處理小時、分和秒的那些格式修飾符。使用其它的修飾符會產生一個 null 值或 0。

curdate()current_date以 'yyyy-mm-dd' 或 yyyymmdd 格式返回當前的日期值,返回的格式取決于該函數是用于字符串還是數字語境中:
mysql> select curdate(); -> '1997-12-15'mysql> select curdate() + 0; -> 19971215
curtime()current_time以 'hh:mm:ss' 或 hhmmss 格式返回當前的時間值,返回的格式取決于該函數是用于字符串還是數字語境中:
mysql> select curtime(); -> '23:50:26'mysql> select curtime() + 0; -> 235026
now()sysdate()current_timestamp以 'yyyy-mm-dd hh:mm:ss' 或 yyyymmddhhmmss 格式返回當前的日期時間值,返回的格式取決于該函數是用于字符串還是數字語境中:
mysql> select now(); -> '1997-12-15 23:50:26'mysql> select now() + 0; -> 19971215235026
注意,函數 now() 在每個查詢中只計算一次,也就是在查詢開始執行時。這就是說,如果在一個單獨的查詢中多次引用了 now(),它只會給出值都是一個相同的時間。

unix_timestamp()unix_timestamp(date)如果調用時沒有參數,以無符號的整數形式返回一個 unix 時間戳(從 '1970-01-01 00:00:00' gmt 開始的秒數)。如果以一個參數 date 調用 unix_timestamp(),它將返回該參數值從 '1970-01-0100:00:00' gmt 開始經過的秒數值。date 可以是一個 date 字符串,一個 datetime 字符串,一個 timestamp,或者以一個 yymmdd 或 yyyymmdd 顯示的本地時間:
mysql> select unix_timestamp(); -> 882226357mysql> select unix_timestamp('1997-10-04 22:23:00'); -> 875996580
當 unix_timestamp 被用于一個 timestamp 列時,函數直接返回一個內部的時間戳值,而不進行一個隱含地 “string-to-unix-timestamp” 轉換。如果你傳遞一個超出范圍的日期參數給 unix_timestamp() ,它將返回 0,但是請注意,mysql 對其僅僅進行基本的檢驗(年范圍 1970-2037,月份 01-12,日期 01-31)。如果你希望減去 unix_timestamp() 列,你應該需要將結果強制轉換為一有符號整數。查看章節 6.3.5 cast 函數。

from_unixtime(unix_timestamp [,format])以 'yyyy-mm-dd hh:mm:ss' 或 yyyymmddhhmmss 格式返回一個 unix_timestamp 參數值,返回值的形式取決于該函數使用于字符串還是數字語境。如果 format 給出,返回值依 format 字符串被格式。format 可以包含與 date_format() 函數同樣的修飾符。
mysql> select from_unixtime(875996580); -> '1997-10-04 22:23:00'mysql> select from_unixtime(875996580) + 0; -> 19971004222300mysql> select from_unixtime(unix_timestamp(), '%y %d %m %h:%i:%s %x'); -> '1997 23rd december 03:43:30 1997'
sec_to_time(seconds)以 'hh:mm:ss' 或 hhmmss 格式返回參數 seconds 被轉換到時分秒后的值,返回值的形式取決于該函數使用于字符串還是數字語境:
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'); -> 80580mysql> select time_to_sec('00:39:38'); -> 2378
6.3.5 cast 函數
cast 函數的句法如下:



cast(expression as type)或convert(expression,type)

type 可以是下面的任一個:binarychar (4.0.6 中新加入)datedatetimesigned {integer}timeunsigned {integer}
cast() 是 ansi sql99 的句法,convert() 是 odbc 的句法。

cast 函數主要用于以特殊的 create ... select 形式建立一個列時:

create table new_table select cast('2000-01-01' as date);

cast(string as binary 與 binary string 是相同的。cast(expr as char 表示一個使用當前默認字符集的字符串。

為了將一個字符串轉換成一個數字值,通常不需要做任何事情;只要將字符串值當做一個數字即可:

mysql> select 1+'1'; -> 2

如果在一個字符串語境中使用一個數字,該數字會被自動地轉換為一個 binary 字符串。

mysql> select concat("hello you ",2); -> "hello you 2"

mysql 支持兩方是有符號的和無符號的 64 位值的算術運算。如果你使用一個數字操作符(比如 +),并且其中的一個操作數是 unsigned integer,那么結果將是無符號的。為了不考慮這些問題,你可以使用 signed 和 unsigned cast 操作符來,它會分別地強制運算到一個有符號的或一個無符號的 64 位整數。

mysql> select cast(1-2 as unsigned) -> 18446744073709551615mysql> select cast(cast(1-2 as unsigned) as signed); -> -1

注意,如果任一個操作數是一個浮點值(在這種語境下,decimal() 被當作是一個浮點數值),結果也將是一個浮點數值,并且結果不受上面的規則影響。

mysql> select cast(1 as unsigned) -2.0 -> -1.0

如果在一個算術運算中使用一個字符串,它將被轉換為一個浮點數字。

函數 cast() 和 convert() 在 mysql 4.0.2 中被加入。

為了完全支持 bigint,在 mysql 4.0 中對無符號值的處理發生了改變。如果希望你的代碼在 mysql 4.0 和 3.23 中均能夠正常運行(在這種情況下,你或許不能夠使用 cast 函數),當進行兩個無符號整數列的減法時,你可以使用下面的技巧得到一個有符號的結果:

select (unsigned_column_1+0.0)-(unsigned_column_2+0.0);

這個做法是在進行減法之前,先將無符號列轉換為一個浮點數。

如果你將舊的 mysql 應用程序移植到 mysql 4.0 時,在 unsigned 列上出現了問題,你可以在啟動 mysqld 時使用 --sql-mode=no_unsigned_subtraction 選項。注意,只要你使用了這個選項,你將不能直接地使用 unsigned bigint 列類型。
6.3.6 其它函數6.3.6.1 位函數


mysql 使用 bigint (64 位) 算法進行位運算,因而這些操作符有一個 64 位的最大范圍。
| 位或
mysql> select 29 | 15; -> 31
返回值是一個 64 位的無符號整數。

&位與
mysql> select 29 & 15; -> 13
返回值是一個 64 位的無符號整數。

^位異或
mysql> select 1 ^ 1; -> 0mysql> select 1 ^ 0; -> 1mysql> select 11 ^ 3; -> 8
返回值是一個 64 位的無符號整數。xor 在 mysql 4.0.2 中被加入。

<<左移一個長長的數字(bigint):
mysql> select 1 << 2; -> 4
返回值是一個 64 位的無符號整數。

>>右移一個長長的數字(bigint):
mysql> select 4 >> 2; -> 1
返回值是一個 64 位的無符號整數。

~置反所有位:
mysql> select 5 & ~1; -> 4
返回值是一個 64 位的無符號整數。

bit_count(n)返回在參數 n 中嵌入的比特位數量:
mysql> select bit_count(29); -> 4
6.3.6.2 輔助功能函數

database() 返回當前數據庫名:
mysql> select database(); -> 'test'
如果沒有當前數據庫,database() 返回一個空字符串。user()system_user()session_user()返回當前 mysql 用戶名:
mysql> select user(); -> '[email protected]'
在 mysql 3.22.11 或更新的版本中,返回值包含用戶名和客戶機的主機名。你可以象下面所示的僅取出用戶名部分(無論值是否包含一個主機名部分,它均能正常工作):
mysql> select substring_index(user(),"@",1); -> 'davida'
current_user()返回當前會話被驗證匹配的用戶名:
mysql> select user(); -> '[email protected]'mysql> select * from mysql.user; -> error 1044: access denied for user: '@localhost' to database 'mysql'mysql> select current_user(); -> '@localhost'
password(str)old_password(str)從純文本口令 str 計算一個口令字符串。這個函數用于對存儲到授權表 user 的password 列中的 mysql 口令進行加密。
mysql> select password('badpwd'); -> '7f84554057dd964b'
password() 加密是不可逆的。password() 不以與 unix 口令加密相同的方式進行口令加密。參見 encrypt()。 注意,password() 函數是用于在 mysql 服務中驗證系統的,你不應該 在你的應用程序中使用它。你可以使用 md5() 或 sha1() 代替使用它。同樣查看 rfc-2195 可獲得有關應用程序的口令處理與安全驗證的更多信息。encrypt(str[,salt])encrypt使用 unix crypt() 系統調用加密 str 。參數 salt 應該是一個有兩個字符的字符串,(在 mysql 3.22.16 中,salt 可以超過兩個字符。):
mysql> select encrypt("hello"); -> 'vxufajxvarroc'
如果 crypt() 在你的系統上不可用,encrypt() 總是返回 null。encrypt() 只保留 str 中前 8 個字符,而忽略其它所有的,至少在某些系統上是這樣的。這取決于底層 crypt() 系統調用的行為。

encode(str,pass_str)使用 pass_str 做為密鑰加密 str。使用 decode() 解密結果。結果是一個與 string 一樣長的二進制字符。如果希望將它保存到一個列中,請使用 blob 列類型。

decode(crypt_str,pass_str)使用 pass_str 作為密鑰解密加密后的字符串 crypt_str。crypt_str 應該是一個由 encode() 返回的字符串。

md5(string)計算一個字符串的 md5 128 位校驗和。值作為一個 32 位的十六進制數字返回,例如,被用于一個哈希(hash)鍵:
mysql> select md5("testing"); -> 'ae2b1fca515949e5d54fb22b8ed95575'
這是 "rsa 數據安全公司的 md5 消息-摘要算法"。

sha1(string)sha(string)計算一個字符串的 sha1 160 位校驗和(在 rfc 3174 (secure hash algorithm) 中被描述)。返回值是一個 40 位的十六進制數字,或在輸入參數為 null 的情況下,返回值為 null。一個使用這個函數的可能就是用于一個哈希鍵。你也可以使用它作為存儲密碼時的密碼安全函數。
mysql> select sha1("abc"); -> 'a9993e364706816aba3e25717850c26c9cd0d89d'
sha1() 在mysql 4.0.2 中被加入,并可被當做比 md5() 加密更安全的等價物。sha() 是 sha1() 的同義詞。

aes_encrypt(string,key_string)aes_decrypt(string,key_string)這些函數允許使用官方的 aes(advanced encryption standardadvanced 先進的密碼技術標準) 算法加密/解密數據。加密時使用 128 位長的密鑰,但是你可以通過修改源碼將其擴展到 256 位。我們選擇 128 位是因為它更快一點并且已足夠安全了。輸入的參數可以是任意長度的。如果任何一個參數是 null,這個函數返回值也將是 null。因為 aes 是一個塊級的算法,加密不同長度的字符串時會對其進行填充,因而結果字符串的長度也可以通過 16*(trunc(string_length/16)+1) 計算出。如果 aes_decrypt() 發現數據無效或錯誤的填料,它將返回 null。可是,如果輸入的數據或密鑰是無效的,函數仍然可能返回一個非 null 值 (可能是無用的信息)。通過修改你的 sql 語句,你可以使用 aes 函數以一個加密的形式存儲數據:
insert into t values (1,aes_encrypt("text","password"));
盡量避免在一個連接上的每個查詢中傳遞密鑰,這樣可以得到更高的安全性,上述方式可以通過連接時在服務器端存儲密鑰來完成:
select @password:="my password";insert into t values (1,aes_encrypt("text",@password));
aes_encrypt() 和 aes_decrypt() 在 mysql 4.0.2 中被加入,可以被考慮為當前 mysql 中可用的加解密函數中最密碼安全的。

des_encrypt(string_to_encrypt [, (key_number | key_string) ] )使用 triple-des 算法以給定的密鑰對字符串加密。注意,只有配置了 mysql 對 ssl 的支持,這個函數才能正常工作。查看章節 4.3.9 使用安全地連接。編碼密鑰以下列各項方法選擇:參數 含義 只有一個參數 des-key-file 中的第一個密鑰被使用。key number des-key-file 中給定的密鑰 (0-9) 被使用。string 給定的 key_string 將被用于加密 string_to_encrypt。返回字符串是一個二進制字符串,并且第一個字符是 char(128 | key_number)。128 被加入是為了更加容易地識別一個加密密鑰。如果你使用一個字符串密鑰,key_number 將是 127。當發生錯誤時,這個函數返回 null。返回字符串的長度將為:new_length= org_length + (8-(org_length % 8))+1。des-key-file 的格式如下:
key_number des_key_stringkey_number des_key_string
每個 key_number 必須是一個在 0 到 9 范圍之內的數字。文件中的行可以是任何次序的。des_key_string 是用于加密消息的字符串。在數字與密鑰之間至少要有一個空格。如果你沒在 des_encrypt() 指定任何密鑰參數,那么文件中的第一個密鑰將被缺省使用。以 flush des_key_file 命令,你可以告訴 mysql 從密鑰文件中讀取新的密鑰值。這個操作需要你有 reload_priv 權限。 有一套默認密鑰的一個好處就是,它給應用程序一個檢查存在的加密列值的方法,而不需要給最終用戶解密這些值的權限。
mysql> select customer_address from customer_table where crypted_credit_card = des_encrypt("credit_card_number");
des_decrypt(string_to_decrypt [, key_string])解密 des_encrypt() 加密后的字符串。注意,只有配置了 mysql 對 ssl 的支持,這個函數才能正常工作。查看章節 4.3.9 使用安全地連接。如果 key_string 參數沒有給出,des_decrypt() 檢查加密字符串的第一個字節,以確定用于加密原始字符串的 des 密鑰數字,然后從 des-key-file 讀取密鑰用于解密消息。為了能這樣工作,該用戶必須有 super 權限。如果將一個 key_string 參數傳遞給該函數,這個字符串將被作為解密消息的密鑰。如果 string_to_decrypt 看上去不像是一個加密字符串,mysql 將返回給定的 string_to_decrypt。當發生錯誤時,該函數返回 null。

last_insert_id([expr])返回被插入到一個 auto_increment 列中的最后一個自動產生的值。查看章節 8.1.3.130 mysql_insert_id()。
mysql> select last_insert_id(); -> 195
最后產生的 id 是以每個連接為基礎在服務器端被維護的。它不可能被其它的客戶端連接改變。如果你以一個非特殊值(即一個非 null 和非 0 的值)更新其它的 auto_increment,它甚至也不會改變。如果你在同一時間內以一個插入語句插入了許多記錄行,last_insert_id() 將返回第一個被插入行的值。這樣做的原因是因為,這可能列容易地在其它服務器上再現同一條 insert 語句。如果 expr 被作為一個參數傳遞給 last_insert_id(),那么函數將返回這個參數的值,并且被設置為 last_insert_id() 返回的下一個值。這可被用于模擬一個序列:首先創建一個表:
mysql> create table sequence (id int not null);mysql> insert into sequence values (0);
然后這個表可以被用來以下面的方式產生序列值:
mysql> update sequence set id=last_insert_id(id+1);
你也可以不調用 last_insert_id() 產生序列,但是以這種方式使用這個函數的作用就是,id 值是在服務器端敘談最后的自動產生值被維護的(是多用戶安全的)。你可以檢索這的新的 id 值,就好像讀取 mysql 中任何正常的 auto_increment 值一樣。舉例來說,last_insert_id()(無任何參數) 將返回一個新的 id。c api 函數mysql_insert_id() 也可以用來得到這個值。注意,由于 mysql_insert_id() 僅僅只能用于在 insert 和 update 語句的更新之后,所以在執行了其它的 sql 語句(比如 select 或 set)之后,你不能夠使用 c api 函數檢索到 last_insert_id(expr) 的值。

format(x,d)將數字 x 格式化為一個 '#,###,###.##' 的形式,四舍五入到 d 位小數。如果 d 為 0,返回的結果將沒有小數點和小數部分:
mysql> select format(12332.123456, 4); -> '12,332.1235'mysql> select format(12332.1,4); -> '12,332.1000'mysql> select format(12332.2,0); -> '12,332'
version()以一個字符串形式返回 mysql 服務器的版本:
mysql> select version(); -> '3.23.13-log'
注意,如果你的版本以 -log 結果,那就意味著日志是被設為可用的。

connection_id()返回當前連接的連接 id(thread_id)。每個連接均有一個自己唯一的 id:
mysql> select connection_id(); -> 1
get_lock(str,timeout)嘗試獲得一個由字符串 str 給定名字的鎖定與一個 timeout 秒的超時。如果鎖定被獲得成功,返回 1,如果嘗試超時,返回 0,或者一個錯誤發生(比如內存溢出或線程被 mysqladmin kill 殺死),返回null。當你執行 release_lock()、執行一個新的 get_lock(),或線程終止時,一個鎖定被釋放。這個函數可以被用于執行應用程序鎖定或模擬記錄鎖定。它會阻塞其它的客戶端用同樣的名字的鎖定請求;遵從一個給定鎖定字符串名的客戶端可以使用這個字符串來執行子協作建議的鎖定:
mysql> select get_lock("lock1",10); -> 1mysql> select is_free_lock("lock2"); -> 1mysql> select get_lock("lock2",10); -> 1mysql> select release_lock("lock2"); -> 1mysql> select release_lock("lock1"); -> null
注意,第二個 release_lock() 調用返回 null 是因為 "lock1" 鎖定被第二個 get_lock() 調用自動地釋放了。

release_lock(str)釋放由字符串 str 命名的通過 get_lock() 獲得的鎖定。如果鎖定被釋放,返回 1;如果鎖定并沒有被當前線程鎖定(在這種情況下,鎖定不會被釋放),返回 0;如果命名的鎖定不存在,返回 null。如果鎖定從來就沒有通過調用一個 get_lock() 獲得,或已被釋放了,那么該鎖定將不存在。do 語句通常與 release_lock() 一起使用。查看章節 6.4.10 do 句法。

is_free_lock(str)檢查以 str 命名的鎖定是否可以自由使用(也就是說,還未鎖定)。如果鎖定被釋放了(沒有一個人使用這個鎖定),返回 1;如果這個鎖定處于使用中,返回 0;如果發生一個錯(例如錯誤的參數),返回 null。

benchmark(count,expr)benchmark() 函數用于將表達式 expr 重復運行 count 次。它可以被用于計時 mysql 處理表達式有多快。結果通常為 0。在 mysql 客戶端有意使用它時,它將返回查詢執行所需的時間:
mysql> select benchmark(1000000,encode("hello","goodbye"));+----------------------------------------------+| benchmark(1000000,encode("hello","goodbye")) |+----------------------------------------------+| 0 |+----------------------------------------------+1 row in set (4.74 sec)
報告的時間是客戶端經過的時間,不是服務器端的 cpu 時間。執行 benchmark() 多次可能是明智的,并注意服務器的負載來解釋結果。

inet_ntoa(expr)給定一個數字的網絡地址 (4 或 8 字節),以一個字符串的形式返回點組表示的地址:
mysql> select inet_ntoa(3520061480); -> "209.207.224.40"
inet_aton(expr)以字符串的形式給定一個點組表示的網絡地址,返回一個地址的數字值表示的整數。地址可以是 4 或 8 個字節的地址:
mysql> select inet_aton("209.207.224.40"); -> 3520061480
產生的數字通常是以網絡地址字節的順序;例如,上面的數字是以 209*256^3 + 207*256^2 + 224*256 +40 被計算出來的。

master_pos_wait(log_name, log_pos)阻塞,只到從服務器到達(也就是說,已讀取并應用了所有更新,一直到)主服務器上的日志中指定的位置。如果主服務器上的信息沒有初始化,或如果參數錯誤,返回 null。如果從服務器沒有運行,將阻塞并造作,只到它啟動并到達或超過指定的位置。如果從服務器已超過指定的位置,立即返回。如果 timeout (在 4.0.10 中新加入) 被指定,當等待 timeout 秒經過后,將放棄。timeout 必須大于 0;一個零或一個負值 timeout 意味著超時。返回值是到達日志指定位置所必須等待的日志事件的數量,或者在出錯的情況下為 null,或者超過超時時間返回 -1。這個命令有益于控制主從服務器的同步,但是最初是為了復制測試的方便而寫的。

found_rows()返回最后一個 select sql_calc_found_rows ... 命令如果沒有以 limit 進行限制結果時將返回記錄行數。
mysql> select sql_calc_found_rows * from tbl_name where id > 100 limit 10;mysql> select found_rows();
第二個 select 將返回一個數字,它指示前一個沒有被 limit 子句限制的 select 將返回多少行記錄。注意,如果你使用 select sql_calc_found_rows ...,mysql 不得不計算所有的記錄行到結果集中。然而,這與你不使用 limit 相比是更快一點的,因為結果集不需要發送到客戶端。sql_calc_found_rows 從 mysql 4.0.0 開始可以被使用。6.3.7 用于 group by 子句的函數


如果在一個沒有包含 group by 子句的一個語句中使用聚合函數,它將等價于將所有的記錄行分為一組。
count(expr) 返回由一個 select 語句檢索出來的記錄行中非 null 值的記錄總數目:
mysql> select student.student_name,count(*) -> from student,course -> where student.student_id=course.student_id -> group by student_name;
count(*) 在它返回檢索出的記錄行的數目上稍微有點不同,它不管記錄行中是否包括 null 值。如果 select 語句從一個表中進行檢索,沒有檢索其它的列,并且沒有 where 子句,那么 count(*) 將被優化以便更快地返回值。示例如下:
mysql> select count(*) from student;
count(distinct expr,[expr...])返回一個互不相同的非 null 的值的總數目:
mysql> select count(distinct results) from student;
在 mysql 中,通過給出一個表達式列表,可以得到不包含 null 的不同的表達式組合的數目。在 ansi sql 中,你可能不得不在 count(distinct ...) 中拼接所有的表達式。

avg(expr)返回 expr 的平均值:
mysql> select student_name, avg(test_score) -> from student -> group by student_name;
min(expr)max(expr)返回 expr 的最小或最大值。min() 和 max() 可以接受一個字符串參數;在這種情況下,它們將返回最小或最大的字符串傳下。查看章節 5.4.3 mysql 如何使用索引。
mysql> select student_name, min(test_score), max(test_score) -> from student -> group by student_name;
在 min()、max() 和其它的合計函數中,mysql 通常列的字符串值比較 enum 和 set 列,而不是字符串在集合中相對應的位置。這將會被修正。sum(expr)返回 expr 的總和。注意,如果返回集中沒有從我任何記錄行,它將返回 null !

group_concat(expr)完整句法如下:
group_concat([distinct] expr [,expr ...] [order by {unsigned_integer | col_name | formula} [asc | desc] [,col ...]] [separator str_val])
這個函數在 mysql 4.1 中被加入。函數返回一個字符串結果,該結果由分組中的值連接組合而成:
mysql> select student_name, -> group_concat(test_score) -> from student -> group by student_name;ormysql> select student_name, -> group_concat(distinct test_score -> order by test_score desc separator " ") -> from student -> group by student_name;
在 mysql 中,你可以得到表達式結合體的連結值。通過使用 distinct 可以排除重復值。如果希望對結果中的值進行排序,可以使用 order by 子句。為了以倒序排序,可以在 order by 子句中用于排序的列名后添加一個 desc (遞減 descending) 關鍵詞。缺省為升序;這也可以通過使用 asc 關鍵詞明確指定。separator 是一個字符串值,它被用于插入到結果值中。缺省為一個逗號 (",")。你可以通過指定 separator "" 完全地移除這個分隔符。在你的配置中,通過變量 group_concat_max_len 要以設置一個最大的長度。在運行時執行的句法如下:
set [session | global] group_concat_max_len = unsigned_integer;
如果最大長度被設置,結果值被剪切到這個最大長度。group_concat() 函數是一個增強的 sybase sql anywhere 支持的基本 list() 函數。如果只有一個列,并且沒有其它選項被指定,group_concat() 是向后兼容有極大限制的 list() 函數。list() 有一個缺省的排序次序。
示例(譯者注):
mysql> create table `ta` ( -> `id` smallint(5) unsigned not null default '0', -> `name` char(60) not null default '', -> key `id` (`id`) -> ) type=myisam;query ok, 0 rows affected (0.02 sec)mysql> insert into `ta` values("1", "a"),("1", "b"), -> ("1", "c"),("1", "d"),("2", "a"), -> ("2", "b"),("2", "c"),("3", "d");query ok, 8 rows affected (0.03 sec)records: 8 duplicates: 0 warnings: 0mysql> select * from `ta`;+----+------+| id | name |+----+------+| 1 | a || 1 | b || 1 | c || 1 | d || 2 | a || 2 | b || 2 | c || 3 | d |+----+------+8 rows in set (0.00 sec)mysql> select `id`, -> group_concat(`name`) -> from `ta` -> group by `id`;+----+----------------------+| id | group_concat(`name`) |+----+----------------------+| 1 | a c b d || 2 | a c b || 3 | d |+----+----------------------+3 rows in set (0.03 sec)# separator 缺省是一個空格而不是一個逗號mysql> select `id`, -> group_concat(distinct `name` -> order by `name` desc separator ",") as result -> from `ta` -> group by `id`;+----+---------+| id | result |+----+---------+| 1 | d,c,b,a || 2 | c,b,a || 3 | d |+----+---------+3 rows in set (0.00 sec)* 以上結果在 mysql 4.1 中測試
示例結束(譯者注)

variance(expr)返回 expr 的標準方差(standard variance)。這是對 ansi sql 的擴展(只有在 4.1 或更新的版本中可用)。

std(expr)stddev(expr)返回 expr 的標準偏差(standard deviation)。這是對 ansi sql 的擴展。這個函數的 stddev() 格式是為了 oracle 兼容而提供的。

bit_or(expr)返回 expr 中所有比特位的位 or。計算以 64 位 (bigint) 精度執行。

bit_and(expr)返回 expr 中所有比特位的位 and。計算以 64 位 (bigint) 精度執行。
示例(譯者注):
mysql> create table `ta` ( -> `id` smallint(5) unsigned not null default '0', -> key `id` (`id`) -> ) type=myisam;query ok, 0 rows affected (0.01 sec)mysql> insert into `ta` values("1"),("2"),("3"),("4");query ok, 8 rows affected (0.00 sec)records: 4 duplicates: 0 warnings: 0mysql> select bit_or(id) from ta;+------------+| bit_or(id) |+------------+| 7 |+------------+1 row in set (0.00 sec)# ..0001# ..0010# ..0011# ..0100# or ..0000# ---------# ..0111mysql> select bit_and(id) from ta;+-------------+| bit_and(id) |+-------------+| 0 |+-------------+1 row in set (0.00 sec)# ..0001# ..0010# ..0011# ..0100# and ..1111# ----------# ..0000* 以上結果在 mysql 4.1 中測試
示例結束(譯者注)


mysql 擴展了 group by 的用法。在 select 表達式中,你可以使用或計算沒有出現在 group by 部分中的列。這代表 這個組的任何可能的值。你可以使用它避免在不必要的分類項目上進行排序和分組,這樣會得到更好的性能。舉例來說,在下面的例子中,你不必要以 customer.name 進行分組:

mysql> select order.custid,customer.name,max(payments) -> from order,customer -> where order.custid = customer.custid -> group by order.custid;

在 ansi sql 中,必須將customer.name 添加到 group by 子句。而在 mysql 中,如果沒有以 ansi 模式運行,該名是多余的。

如果你在 group by 部分省略的列在分組中不是唯一的,請不要使用這個特征!否則將得到不可預知的結果。

在某些情況下,可以使用 min() 和 max() 獲得一個特定的列值,即使它不是唯一的。下面的示例取出包含了 sort 列中最小值的記錄行中的 column 的值:

substr(min(concat(rpad(sort,6,' '),column)),7)

查看章節 3.5.4 擁有某個字段的組間最大值的記錄行。

注意,如果你所使用的是 mysql 3.22 (或更早的版本),或者你正試圖遵從 ansi sql,你不能在 group by 或 order by 子句中使用表達式。你可以使用表達式的別名來應付這個限制:

mysql> select id,floor(value/100) as val from tbl_name -> group by id,val order by val;

在 mysql 3.23 中,你可以這樣做:

mysql> select id,floor(value/100) from tbl_name order by rand();
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳春市| 邵阳县| 雅江县| 丽水市| 湖南省| 屏东县| 大竹县| 三原县| 横山县| 霞浦县| 亳州市| 社会| 融水| 筠连县| 株洲县| 板桥市| 贵州省| 奉化市| 绥德县| 淮北市| 文安县| 焦作市| 浙江省| 攀枝花市| 巴青县| 仙游县| 准格尔旗| 侯马市| 垣曲县| 汤原县| 勃利县| 灵山县| 永丰县| 吕梁市| 彭州市| 东兰县| 西藏| 通化市| 吴旗县| 定边县| 贡觉县|