信息函数
信息函数
名称 | 描述 |
---|---|
BENCHMARK() | 重复执行一个表达式 |
CHARSET() | 返回参数的字符集 |
COERCIBILITY() | 返回字符串参数的校验规则强制性值 |
COLLATION() | 返回字符串参数的校验规则 |
CONNECTION_ID() | 返回连接的连接ID(线程ID) |
CURRENT_ROLE() | 返回当前的活动角色 |
CURRENT_USER() ,CURRENT_USER | 经过身份验证的用户名和主机名 |
DATABASE() | 返回默认(当前)数据库名称 |
FOUND_ROWS() | 对于带有LIMIT子句的SELECT,如果没有LIMIT子句,将返回的行数 |
ICU_VERSION() | ICU库版本 |
LAST_INSERT_ID() | 最后一个INSERT的AUTOINCREMENT列的值 |
ROLES_GRAPHML() | 返回表示内存角色子图的GraphML文档 |
ROW_COUNT() | 更新的行数 |
SCHEMA() | DATABASE()的同义词 |
SESSION_USER() | USER()的同义词 |
SYSTEM_USER() | USER()的同义词 |
USER() | 客户端提供的用户名和主机名 |
VERSION() | 返回一个指示MySQL服务器版本的字符串 |
BENCHMARK(count,expr)
该
BENCHMARK()
函数expr
重复执行表达式多次count
。它可以用来计时MySQL处理表达式的速度。结果值为0
,或者NULL
对于不适当的参数(例如NULL
重复计数或负计数)。预期用途来自mysql客户端,该客户端报告查询执行时间:
mysql>
SELECT BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')); +--------------------------------------------------- + | BENCHMARK(1000000,AES_ENCRYPT('hello','goodbye')) | +--------------------------------------------------- + | 0 | +--------------------------------------------------- + 1 row in set (4.74 sec)报告的时间是客户端的经过时间,而不是服务器端的CPU时间。建议执行
BENCHMARK()
几次,并根据服务器计算机的负载情况解释结果。BENCHMARK()
用于测量标量表达式的运行时性能,这对使用它和解释结果的方式有一些重要影响:- 只能使用标量表达式。尽管表达式可以是子查询,但它必须返回单列和最多单行。例如,
BENCHMARK(10,(SELECT * FROM t))
如果表t
具有多于一列或多于一行,将失败。 - 执行语句的时间与所执行的开销量不同。两者的执行配置文件非常不同,您不应期望它们花费相同的时间。前者涉及解析器,优化器,表锁定和运行时评估时间。后者仅涉及运行时评估
SELECT expr
N
SELECT BENCHMARK(N,expr)
N
N
时间,而所有其他组件仅一次。已经分配的内存结构将被重用,并且运行时优化(例如已针对聚合函数评估的结果的本地缓存)可能会更改结果。BENCHMARK()
因此,通过使用,可以通过赋予该组件更多的权重并消除网络,解析器,优化器等引入的“噪音”来衡量该组件的性能。
- 只能使用标量表达式。尽管表达式可以是子查询,但它必须返回单列和最多单行。例如,
CHARSET(str)
返回字符串参数的字符集。
mysql>
SELECT CHARSET('abc'); -> 'utf8' mysql>SELECT CHARSET(CONVERT('abc'USING latin1)); -> 'latin1' mysql>SELECT CHARSET(USER()); -> 'utf8'COERCIBILITY(str)
返回字符串参数的校验规则强制性值。
mysql>
SELECT COERCIBILITY('abc'COLLATE utf8_swedish_ci); -> 0 mysql>SELECT COERCIBILITY(USER()); -> 3 mysql>SELECT COERCIBILITY('abc'); -> 4 mysql>SELECT COERCIBILITY(1000); -> 5返回值具有下表中所示的含义。较低的值具有较高的优先级。
矫顽力 含义 例 0
显式整理 带 COLLATE
子句的值1
没有校验规则 具有不同校验规则的字符串的串联 2
隐式整理 列值,存储的例程参数或局部变量 3
系统常数 USER()
返回值4
强制的 文字字符串 5
数字 数值或时间值 5
无知的 NULL
或源自的表达式NULL
有关更多信息,请参见“表达式中的校验规则强制性”。
COLLATION(str)
返回字符串参数的校验规则。
mysql>
SELECT COLLATION('abc'); -> 'utf8_general_ci' mysql>SELECT COLLATION(_utf8mb4'abc'); -> 'utf8mb4_0900_ai_ci' mysql>SELECT COLLATION(_latin1'abc'); -> 'latin1_swedish_ci'CONNECTION_ID()
返回连接的连接ID(线程ID)。每个连接都有一个在当前连接的客户端集中唯一的ID。
返回
CONNECTION_ID()
的值ID
与INFORMATION_SCHEMA.PROCESSLIST
表的Id
列,SHOW PROCESSLIST
输出的PROCESSLIST_ID
列和“性能模式”threads
表的列中显示的值类型相同。mysql>
SELECT CONNECTION_ID(); -> 23786CURRENT_ROLE()
返回一个
utf8
字符串,其中包含当前会话的当前活动角色,以逗号分隔,或者NONE
如果没有,则以逗号分隔。该值反映sql_quote_show_create
系统变量的设置。假设一个帐户被授予以下角色:
GRANT 'r1', 'r2'TO 'u1'@'localhost';SET DEFAULT ROLE ALL TO 'u1'@'localhost';在的会话中
u1
,初始CURRENT_ROLE()
值命名默认帐户角色。使用以下SET ROLE
更改:mysql>
SELECT CURRENT_ROLE(); +------------------- + | CURRENT_ROLE() | +------------------- + | `r1`@`%`,`r2`@`%` | +------------------- + mysql>SET ROLE 'r1';SELECT CURRENT_ROLE(); +---------------- + | CURRENT_ROLE() | +---------------- + | `r1`@`%` | +---------------- +CURRENT_USER
,CURRENT_USER()
返回服务器用来认证当前客户端的MySQL帐户的用户名和主机名组合。该帐户确定您的访问权限。返回值是
utf8
字符集中的字符串。值
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()
值的空用户名部分所示)对客户端进行了身份验证。发生这种情况的一种方法是,的授权表中没有列出帐户davida
。在存储的程序或视图中,除非定义了特性,否则
CURRENT_USER()
返回定义对象的用户的帐户(由其DEFINER
值给出)SQL SECURITY INVOKER
。在后一种情况下,CURRENT_USER()
返回对象的调用者。触发器和事件没有定义
SQL SECURITY
特征的选项,因此对于这些对象,CURRENT_USER()
返回定义该对象的用户的帐户。要返回调用者,请使用USER()
或SESSION_USER()
。以下语句支持使用该
CURRENT_USER()
函数代替受影响的用户或定义者的名称(并可能是其主机);在这种情况下,CURRENT_USER()
将在需要的地方进行扩展:DROP USER
RENAME USER
GRANT
REVOKE
CREATE FUNCTION
CREATE PROCEDURE
CREATE TRIGGER
CREATE EVENT
CREATE VIEW
ALTER EVENT
ALTER VIEW
SET PASSWORD
有关此扩展
CURRENT_USER()
对复制的影响的信息,请参见“ CURRENT_USER()的复制”。DATABASE()
以
utf8
字符集的字符串形式返回默认(当前)数据库名称。如果没有默认数据库,则DATABASE()
返回NULL
。在存储的例程中,默认数据库是与该例程关联的数据库,它不一定与调用上下文中的默认数据库相同。mysql>
SELECT DATABASE(); -> 'test'如果没有默认数据库,则
DATABASE()
返回NULL
。FOUND_ROWS()
注意
从 MySQL 8.0.17开始不赞成使用
SQL_CALC_FOUND_ROWS
查询修饰符和附带FOUND_ROWS()
函数,并且在将来的MySQL版本中将删除该修饰符和伴随函数。作为替代,考虑到执行与您的查询LIMIT
,然后用第二个查询COUNT(*)
,并没有LIMIT
确定是否有其他行。例如,代替这些查询:SELECT SQL_CALC_FOUND_ROWS *FROM tbl_nameWHERE id > 100LIMIT 10;SELECT FOUND_ROWS();请改用以下查询:
SELECT *FROM tbl_nameWHERE id > 100LIMIT 10;SELECT COUNT(*)FROM tbl_nameWHERE id > 100;COUNT(*)
受到某些优化。SQL_CALC_FOUND_ROWS
导致一些优化被禁用。一条
SELECT
语句可以包含一个LIMIT
子句,以限制服务器返回给客户端的行数。在某些情况下,理想的情况是知道在没有的情况下该语句将返回多少行LIMIT
,而无需再次运行该语句。要获得此行数,请SQL_CALC_FOUND_ROWS
在SELECT
语句中包括一个选项,然后再调用FOUND_ROWS()
:mysql>
SELECT SQL_CALC_FOUND_ROWS *FROM tbl_name ->WHERE id > 100LIMIT 10; mysql>SELECT FOUND_ROWS();第二个
SELECT
返回一个数字,表示如果SELECT
不使用该LIMIT
子句编写第一个,则第一个将返回多少行。如果
SQL_CALC_FOUND_ROWS
最近的成功SELECT
语句中没有该选项,则FOUND_ROWS()
返回该语句返回的结果集中的行数。如果该语句包含一个LIMIT
子句,则FOUND_ROWS()
返回最大行数。例如,FOUND_ROWS()
如果语句包含LIMIT 10
或,则分别返回10或60LIMIT 50, 10
。可用的行计数
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
LIMIT
UNION
SELECT
UNION
UNION
SQL_CALC_FOUND_ROWS
for 的意图UNION
是,它应返回不带global的行数LIMIT
。使用SQL_CALC_FOUND_ROWS
with 的条件UNION
是:- 该
SQL_CALC_FOUND_ROWS
关键字必须出现在第一个SELECT
的UNION
。 FOUND_ROWS()
仅当UNION ALL
使用时,值才是精确的。如果使用UNION
不ALL
使用,将发生重复删除,并且的值FOUND_ROWS()
仅是近似值。- 如果没有
LIMIT
出现在UNION
,SQL_CALC_FOUND_ROWS
被忽略,返回所创建以处理在临时表中的行数UNION
。
除了此处描述的情况外,的行为
FOUND_ROWS()
是不确定的(例如,SELECT
在出现错误的语句失败后其值)。重要
FOUND_ROWS()
使用基于语句的复制无法可靠地复制。使用基于行的复制会自动复制此功能。- 该
ICU_VERSION()
Unicode国际组件(ICU)库的版本用于支持正则表达式操作(请参见“MySQL正则表达式函数”)。此功能主要用于测试用例。
LAST_INSERT_ID()
,LAST_INSERT_ID(expr)
不带任何参数的情况下,
LAST_INSERT_ID()
将返回BIGINT UNSIGNED
(64位)值,该值表示AUTO_INCREMENT
由于最近执行的INSERT
语句而成功为列成功插入的第一个自动生成的值。LAST_INSERT_ID()
如果没有成功插入任何行,则的值保持不变。带参数
LAST_INSERT_ID()
返回无符号整数。例如,在插入生成
AUTO_INCREMENT
值的行之后,您可以像这样获得值:mysql>
SELECT LAST_INSERT_ID(); -> 195当前正在执行的语句不会影响的值
LAST_INSERT_ID()
。假设您AUTO_INCREMENT
使用一个语句生成一个值,然后LAST_INSERT_ID()
在多行INSERT
语句中引用该语句,该语句将行插入具有自己AUTO_INCREMENT
列的表中。LAST_INSERT_ID()
在第二个语句中,值将保持稳定;第二行和第二行的值不受先前行插入的影响。(但是,如果混合使用对LAST_INSERT_ID()
和的引用,则效果是不确定的。)LAST_INSERT_ID(expr)
如果前一条语句返回错误,则的值
LAST_INSERT_ID()
未定义。对于事务表,如果由于错误而回滚了该语句,LAST_INSERT_ID()
则未定义的值。对于manualROLLBACK
,的值LAST_INSERT_ID()
不会恢复为交易之前的值;它仍然像当时一样ROLLBACK
。在存储的例程(过程或函数)或触发器
LAST_INSERT_ID()
的主体内,更改的值与在此类对象的主体外部执行的语句相同。LAST_INSERT_ID()
通过以下语句可以看到存储的例程或触发器对其值的影响,取决于例程的类型:- 如果存储过程执行的语句更改了的值
LAST_INSERT_ID()
,则该过程调用后的语句将看到更改的值。 - 对于存储的函数和更改该值的触发器,该函数或触发器结束时将恢复该值,因此以下语句将看不到更改后的值。
生成的ID在每个连接的服务器中维护。这意味着函数返回给定客户端的
AUTO_INCREMENT
值是为该客户端影响AUTO_INCREMENT
列的最新语句生成的第一个值。该值不会受到其他客户端的影响,即使它们生成AUTO_INCREMENT
自己的值也是如此。此行为可确保每个客户端都可以检索自己的ID,而不必担心其他客户端的活动,也不需要锁或事务。LAST_INSERT_ID()
如果将AUTO_INCREMENT
行的列设置为非“ magic ”值(即,notNULL
和not 的值),则不会更改的值0
。重要
如果您将使用一个多行
INSERT
的语句,LAST_INSERT_ID()
返回所产生的价值第一次插入的行只。这样做的原因是使INSERT
针对其他服务器轻松重现相同的语句成为可能。例如:
mysql>
USE test; mysql>CREATE TABLE t ( id INTAUTO_INCREMENT NOT NULLPRIMARY KEY ,name VARCHAR(10) NOT NULL ); mysql>INSERT INTO tVALUES (NULL, 'Bob'); mysql>SELECT *FROM t; +---- +------ + | id | name | +---- +------ + | 1 | Bob | +---- +------ + mysql>SELECT LAST_INSERT_ID(); +------------------ + | LAST_INSERT_ID() | +------------------ + | 1 | +------------------ + mysql>INSERT INTO tVALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); mysql>SELECT *FROM t; +---- +------ + | id | name | +---- +------ + | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | +---- +------ + mysql>SELECT LAST_INSERT_ID(); +------------------ + | LAST_INSERT_ID() | +------------------ + | 2 | +------------------ +尽管第二条
INSERT
语句在中插入了三个新行t
,但为这些行中的第一行生成的ID为2
,并且此值由LAST_INSERT_ID()
以下SELECT
语句返回。如果您使用
INSERT IGNORE
且忽略该行,则LAST_INSERT_ID()
当前值保持不变(如果连接尚未成功执行,则返回0INSERT
),并且对于非事务处理表,该AUTO_INCREMENT
计数器不会增加。对于InnoDB
表,AUTO_INCREMENT
如果将计数器innodb_autoinc_lock_mode
设置为1
或2
,则该计数器递增,如以下示例所示:mysql>
USE test; mysql>SELECT @@innodb_autoinc_lock_mode; +---------------------------- + | @@innodb_autoinc_lock_mode | +---------------------------- + | 1 | +---------------------------- + mysql>CREATE TABLE `t` ( `id` INT(11) NOT NULLAUTO_INCREMENT , `val` INT(11)DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `i1` (`val`) )ENGINE =InnoDBDEFAULT CHARSET =latin1; # Insert two rows mysql>INSERT INTO t (val)VALUES (1),(2); # With auto_increment_offset=1, the inserted rows # result in an AUTO_INCREMENT value of 3 mysql>SHOW CREATE TABLE t\G *************************** 1. row *************************** Table : t Create Table : CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 # LAST_INSERT_ID() returns the first automatically generated # value that is successfully inserted for the AUTO_INCREMENT column mysql>SELECT LAST_INSERT_ID(); +------------------ + | LAST_INSERT_ID() | +------------------ + | 1 | +------------------ + # The attempted insertion of duplicate rows fail but errors are ignored mysql>INSERT IGNORE INTO t (val)VALUES (1),(2); Query OK, 0 rows affected (0.00 sec) Records: 2 Duplicates: 2 Warnings: 0 # With innodb_autoinc_lock_mode=1, the AUTO_INCREMENT counter # is incremented for the ignored rows mysql>SHOW CREATE TABLE t\G *************************** 1. row *************************** Table : t Create Table : CREATE TABLE `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i1` (`val`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 # The LAST_INSERT_ID is unchanged because the previous insert was unsuccessful mysql>SELECT LAST_INSERT_ID(); +------------------ + | LAST_INSERT_ID() | +------------------ + | 1 | +------------------ +有关更多信息,请参见“ InnoDB中的AUTO_INCREMENT处理”。
如果
expr
将用作参数LAST_INSERT_ID()
,则该参数的值由函数返回,并记住为的下一个值LAST_INSERT_ID()
。这可以用来模拟序列:创建一个表来保存序列计数器并对其进行初始化:
mysql>
CREATE TABLE sequence (id INT NOT NULL); mysql>INSERT INTO sequenceVALUES (0);使用该表生成如下的序列号:
mysql>
UPDATE sequenceSET id=LAST_INSERT_ID(id+1); mysql>SELECT LAST_INSERT_ID();该
UPDATE
语句递增序列计数器,并导致下一次调用LAST_INSERT_ID()
返回更新后的值。该SELECT
语句检索该值。在mysql_insert_id()
C API函数也可以用于获取价值。请参见“ mysql_insert_id()”。
您可以在不调用的情况下生成序列
LAST_INSERT_ID()
,但是以这种方式使用该函数的实用程序是ID值作为最后一个自动生成的值在服务器中维护。这是多用户安全的,因为多个客户端可以发出该UPDATE
语句并使用该SELECT
语句(或mysql_insert_id()
)获取自己的序列值,而不会影响或受到生成自己的序列值的其他客户端的影响。请注意,
mysql_insert_id()
仅在INSERT
和UPDATE
语句之后更新,因此在执行其他SQL语句(例如或)后,不能使用C API函数来检索其值。LAST_INSERT_ID(expr)
SELECT
SET
- 如果存储过程执行的语句更改了的值
ROLES_GRAPHML()
返回
utf8
包含表示内存角色子图的GraphML文档的字符串。必须具有ROLE_ADMIN
orSUPER
特权才能参见<graphml>
元素中的内容。否则,结果仅显示一个空元素:mysql>
SELECT ROLES_GRAPHML(); +--------------------------------------------------- + | ROLES_GRAPHML() | +--------------------------------------------------- + | <?xml version="1.0" encoding="UTF -8"?><graphml /> | +--------------------------------------------------- +ROW_COUNT()
ROW_COUNT()
返回一个值,如下所示:- DDL语句:0。这适用于诸如
CREATE TABLE
或的语句DROP TABLE
。 - DML语句除外
SELECT
:受影响的行数。这适用于报表等UPDATE
,INSERT
或DELETE
(如前),但现在还声明,如ALTER TABLE
和LOAD DATA
。 SELECT
:如果语句返回结果集,则为-1,否则返回“受影响”的行数。例如,对于SELECT * FROM t1
,ROW_COUNT()
返回-1。对于,返回写入文件的行数。SELECT * FROM t1 INTO OUTFILE 'file_name'
ROW_COUNT()
SIGNAL
陈述:0。
对于
UPDATE
语句,默认情况下,受影响的行值为实际更改的行数。如果在连接mysqld时指定CLIENT_FOUND_ROWS
标志,则受影响的行值是“找到”的行数;即与该子句匹配。mysql_real_connect()
WHERE
对于
REPLACE
语句,如果新行替换了旧行,则受影响的行值为2,因为在这种情况下,删除重复行后将插入一行。对于
INSERT ... ON DUPLICATE KEY UPDATE
语句,如果将行作为新行插入,则每行的受影响行值为1;如果更新了现有行,则为2;如果将现有行设置为其当前值,则为0。如果指定该CLIENT_FOUND_ROWS
标志,则将现有行设置为其当前值时,受影响的行值为1(而不是0)。该
ROW_COUNT()
值类似于mysql_affected_rows()
C API函数的值以及mysql客户端在语句执行后显示的行数。mysql>
INSERT INTO tVALUES (1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>SELECT ROW_COUNT(); +------------- + | ROW_COUNT() | +------------- + | 3 | +------------- + 1 row in set (0.00 sec) mysql>DELETE FROM tWHERE iIN (1,2); Query OK, 2 rows affected (0.00 sec) mysql>SELECT ROW_COUNT(); +------------- + | ROW_COUNT() | +------------- + | 2 | +------------- + 1 row in set (0.00 sec)重要
ROW_COUNT()
使用基于语句的复制无法可靠地复制。使用基于行的复制会自动复制此功能。- DDL语句:0。这适用于诸如
SCHEMA()
此功能是的同义词
DATABASE()
。SESSION_USER()
SESSION_USER()
是的同义词USER()
。SYSTEM_USER()
SYSTEM_USER()
是的同义词USER()
。注意
该
SYSTEM_USER()
功能与SYSTEM_USER
特权不同。前者返回当前的MySQL帐户名。后者区分系统用户帐户和常规用户帐户类别(请参见“帐户类别”)。USER()
以
utf8
字符集的字符串形式返回当前的MySQL用户名和主机名。mysql>
SELECT USER(); -> 'davida@localhost'该值指示您在连接到服务器时指定的用户名以及从中连接的客户端主机。该值可以与的值不同
CURRENT_USER()
。VERSION()
返回指示MySQL服务器版本的字符串。字符串使用
utf8
字符集。该值除版本号外还可以带有后缀。请参见“服务器系统变量”中对version
系统变量的描述。此功能对于基于语句的复制不安全。设置为时,如果使用此功能,
binlog_format
将记录警告STATEMENT
。mysql>
SELECT VERSION(); -> '8.0.21-standard'