top
Loading...
12.9.3.信息函數
12.9.3. 信息函數
  • BENCHMARK(count,expr)

BENCHMARK() 函數重復count 次執行表達式 expr 。 它可以被用于計算  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(),并解釋與服務器機器負荷程度有關的結果。

·         CHARSET(str)

返回字符串自變量的字符集。

mysql> SELECT CHARSET('abc');
        -> 'latin1'
mysql> SELECT CHARSET(CONVERT('abc' USING utf8));
        -> 'utf8'
mysql> SELECT CHARSET(USER());
        -> 'utf8'

·         COERCIBILITY(str)

返回字符串自變量的整序可壓縮性值。

mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci);
        -> 0
mysql> SELECT COERCIBILITY(USER());
        -> 3
mysql> SELECT COERCIBILITY('abc');
        -> 4

返回值具有如下意義:

可壓縮性

意義

舉例

0

明確排序

帶有COLLATE 子句的值

1

無排序

不同排序的字符串連接

2

明確排序

列值

3

系統常量

USER()返回值

4

可壓縮

文字字符串

5

可忽略

NULL得來的NULL或一個表達式

 

 

下方值得優先級較高。

  • COLLATION(str)

返回惠字符串參數的排序方式。

mysql> SELECT COLLATION('abc');

        -> 'latin1_swedish_ci'

mysql> SELECT COLLATION(_utf8'abc');

        -> 'utf8_general_ci'

  • CONNECTION_ID()

返回對于連接的連接ID (線程ID)。每個連接都有各自的唯一 ID

mysql> SELECT CONNECTION_ID();

        -> 23786

  • CURRENT_USER, CURRENT_USER()

返回當前話路被驗證的用戶名和主機名組合。這個值符合確定你的存取權限的MySQL 賬戶。在被指定SQL SECURITY DEFINER特征的存儲程序內, CURRENT_USER() 返回程序的創建者。

 CURRENT_USER()的值可以和USER()的值有所不同。

mysql> SELECT USER();

        -> 'davida@localhost'

mysql> SELECT * FROM mysql.user;

ERROR 1044: Access denied for user ''@'localhost' to

database 'mysql'

mysql> SELECT CURRENT_USER();

        -> '@localhost'

這個例子解釋了雖然客戶端指定了一個 davida用戶名 (正如USER()函數的值所指示的), 服務器卻使用一個匿名的用戶賬戶確認該客戶端 (CURRENT_USER()值得空用戶名部分 )。這種情況發生的一個原因是 One 在向 davida的授權列表中沒有足夠的賬戶。 

 CURRENT_USER() 返回的字符串使用 utf8字符集。

  • DATABASE()

返回使用 utf8 字符集的默認(當前)數據庫名。在存儲程序里,默認數據庫是同該程序向關聯的數據庫,但并不一定與調用語境的默認數據庫相同。 

mysql> SELECT DATABASE();

        -> 'test'

若沒有默認數據庫, DATABASE()返回 NULL

  • FOUND_ROWS()

A SELECT語句可能包括一個 LIMIT 子句,用來限制服務器返回客戶端的行數。在有些情況下,需要不用再次運行該語句而得知在沒有LIMIT 時到底該語句返回了多少行。為了知道這個行數, 包括在SELECT 語句中選擇  SQL_CALC_FOUND_ROWS ,隨后調用 FOUND_ROWS()

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 選項,則使用LIMIT 和不使用時,FOUND_ROWS() 可能會返回不同的結果)

通過 FOUND_ROWS()的有效行數是瞬時的,并且不用于越過SELECT SQL_CALC_FOUND_ROWS語句后面的語句。若你需要稍候參閱這個值,那么將其保存:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;

mysql> SET @rows = FOUND_ROWS();

假如你正在使用 SELECT SQL_CALC_FOUND_ROWS, MySQL 必須計算出在全部結果集合中有所少行。然而, 這比不用LIMIT而再次運行問詢要快,原因是結果集合不需要被送至客戶端。

SQL_CALC_FOUND_ROWS FOUND_ROWS() 在當你希望限制一個問詢返回的行數時很有用,同時還能不需要再次運行問詢而確定全部結果集合中的行數。一個例子就是提供頁式顯示的Web腳本,該顯示包含顯示搜索結果其它部分的頁的連接。使用FOUND_ROWS() 使你確定剩下的結果需要多少其它的頁。 

SQL_CALC_FOUND_ROWS FOUND_ROWS() 的應用對于UNION 問詢比對于簡單SELECT 語句更為復雜,原因是在UNION 中,LIMIT 可能會出現在多個位置。它可能適用于UNION中的個人 SELECT語句,或是總體上  UNION 結果的全程。

SQL_CALC_FOUND_ROWS對于 UNION的意向是它應該不需要全程LIMIT而返回應返回的行數。SQL_CALC_FOUND_ROWS UNION 一同使用的條件是:

    •  SQL_CALC_FOUND_ROWS 關鍵詞必須出現在UNION的第一個 SELECT中。
    •  FOUND_ROWS()的值只有在使用 UNION ALL時才是精確的。若使用不帶ALLUNION,則會發生兩次刪除, 而  FOUND_ROWS() 的指只需近似的。
    • 假若UNION 中沒有出現  LIMIT ,則SQL_CALC_FOUND_ROWS 被忽略,返回臨時表中的創建的用來處理UNION的行數。
  • LAST_INSERT_ID() LAST_INSERT_ID(expr)

自動返回最后一個INSERT UPDATE 問詢為 AUTO_INCREMENT列設置的第一個 發生的值。

mysql> SELECT LAST_INSERT_ID();

        -> 195

產生的ID 每次連接后保存在服務器中。這意味著函數向一個給定客戶端返回的值是該客戶端產生對影響AUTO_INCREMENT列的最新語句第一個 AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即使它們產生它們自己的 AUTO_INCREMENT值。這個行為保證了你能夠找回自己的 ID 而不用擔心其它客戶端的活動,而且不需要加鎖或處理。

假如你使用一個非“magic”值來更新某一行的AUTO_INCREMENT 列,則LAST_INSERT_ID() 的值不會變化(換言之, 一個不是 NULL也不是 0的值)

重點: 假如你使用單INSERT語句插入多個行,  LAST_INSERT_ID() 返回插入的第一行產生的值。其原因是這使依靠其它服務器復制同樣的 INSERT語句變得簡單。

例如:

mysql> USE test;
Database changed
mysql> CREATE TABLE t (
    ->   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   name VARCHAR(10) NOT NULL
    -> );
Query OK, 0 rows affected (0.09 sec)
 
mysql> INSERT INTO t VALUES (NULL, 'Bob');
Query OK, 1 row affected (0.01 sec)
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
+----+------+
1 row in set (0.01 sec)
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)
 
mysql> INSERT INTO t VALUES
    -> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
|  3 | Jane |
|  4 | Lisa |
+----+------+
4 rows in set (0.01 sec)
 
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                2 |
+------------------+
1 row in set (0.00 sec)

雖然第二個問詢將3 個新行插入 t, 對這些行的第一行產生的 ID 2, 這也是 LAST_INSERT_ID()返回的值。

假如你使用 INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT 計數器不會增量,而 LAST_INSERT_ID() 返回0, 這反映出沒有插入任何記錄。

若給出作為到LAST_INSERT_ID()的參數expr ,則參數的值被函數返回,并作為被LAST_INSERT_ID()返回的下一個值而被記憶。這可用于模擬序列:

    • 創建一個表,用來控制順序計數器并使其初始化:

o                     mysql> CREATE TABLE sequence (id INT NOT NULL);

o                     mysql> INSERT INTO sequence VALUES (0);

    • 使用該表產生這樣的序列數 :

o                     mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);

o                     mysql> SELECT LAST_INSERT_ID();

UPDATE 語句會增加順序計數器并引發向LAST_INSERT_ID()  的下一次調用,用來返回升級后的值。 SELECT 語句會檢索這個值。  mysql_insert_id() C API函數也可用于獲取這個值。 見25.2.3.36節,“mysql_insert_id()”.

你可以不用調用LAST_INSERT_ID()而產生序列,但這樣使用這個函數的效用在于 ID值被保存在服務器中,作為自動產生的值。它適用于多個用戶,原因是多個用戶均可使用 UPDATE語句并用SELECT語句(mysql_insert_id()),得到他們自己的序列值,而不會影響其它產生他們自己的序列值的客戶端或被其它產生他們自己的序列值的客戶端所影響。

注意, mysql_insert_id() 僅會在INSERT UPDATE語句后面被升級, 因此你不能在執行了其它諸如SELECT SET 這樣的SQL語句后使用 C API 函數來找回 LAST_INSERT_ID(expr) 對應的值。

  • ROW_COUNT()

ROW_COUNT()返回被前面語句升級的、插入的或刪除的行數。 這個行數和 mysql 客戶端顯示的行數及 mysql_affected_rows() C API 函數返回的值相同。

mysql> INSERT INTO t VALUES(1),(2),(3);

問詢完成, 表中有3 (0.00)

記錄: 3 重復: 0 警告: 0

 

mysql> SELECT ROW_COUNT();

+-------------+

| ROW_COUNT() |

+-------------+

|           3 |

+-------------+

表中有1 (0.00 )

 

mysql> DELETE FROM t WHERE i IN(1,2);

問詢完成, 找到2 (0.00 )

 

mysql> SELECT ROW_COUNT();

+-------------+

| ROW_COUNT() |

+-------------+

|           2 |

+-------------+

表中有1 (0.00 )

  • SCHEMA()

這個函數和 DATABASE()具有相同的意義。

  • SESSION_USER()

SESSION_USER() USER()具有相同的意義。

  • SYSTEM_USER()

SYSTEM_USER() USER()具有相同的意義。

  • USER()

返回當前 MySQL用戶名和機主名/

mysql> SELECT USER();

        -> 'davida@localhost'

這個值指示了你指定的連接服務器時的用戶名,及你所連接的客戶主機。這個值可以和CURRENT_USER() 的值不同。

你可以這樣提取用戶名部分:

mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);

        -> 'davida'

由于 USER() 返回一個utf8 字符集中的值,你也應確保'@' 字符串文字在該字符集中得到解釋:

mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1);

        -> 'davida'

  • VERSION()

返回指示 MySQL 服務器版本的字符串。這個字符串使用 utf8 字符集。

mysql> SELECT VERSION();

        -> '5.1.2-alpha-standard'

注意,假如你的版本字符串以-log結尾,這說明登錄已被激活。 

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/functions.html
北斗有巢氏 有巢氏北斗