暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 信息函数(2)

林员外聊编程 2021-07-31
278
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
 
DATABASE()
 
utf8 字符集的字符串形式返回默认(当前)数据库名称。如果没有默认的数据库,DATABASE() 返回 NULL。在存储例程中,默认数据库是例程关联的数据库,不一定与调用上下文中的默认数据库相同。
 
mysql> SELECT DATABASE();
-> 'test'
复制
 
FOUND_ROWS()
 
注意
 
SQL_CALC_FOUND_ROWS 查询修饰符和伴随的 FOUND_ROWS() 函数从 MySQL 8.0.17 开始已弃用,预期在未来的 MySQL 版本中将删除它们。作为替代,考虑使用 LIMIT 执行查询,然后使用 COUNT(*),不带 LIMIT 执行第二个查询,以确定是否有额外的行。例如,这些查询:
 
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
复制
 
请使用以下查询替代:
 
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) FROM tbl_name WHERE id > 100;
复制
 
COUNT(*) 受某些优化的影响。SQL_CALC_FOUND_ROWS 将导致禁用一些优化。
 
一个 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 选项时,FOUND_ROWS() 将返回该语句返回的结果集中的行数。如果语句包含 LIMIT 子句,则 FOUND_ROWS() 返回限制的最大行数。例如,如果语句包含 LIMIT 10 LIMIT 50, 10,则 FOUND_ROWS() 分别返回1060
 
通过 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() 能够确定剩下的结果需要多少其他页面。
 
对于 UNION 语句,SQL_CALC_FOUND_ROWS FOUND_ROWS() 的使用要比简单的 SELECT 语句复杂,因为 LIMIT 可能出现在一个 UNION 中的多个位置。它可以应用于 UNION 中的单个 SELECT 语句,也可以应用于整个 UNION 结果。
 
SQL_CALC_FOUND_ROWS 用于 UNION 的目的是返回不带全局 LIMIT 的行数。使用带 UNION SQL_CALC_FOUND_ROWS 的条件是:
 
SQL_CALC_FOUND_ROWS 关键字必须出现在 UNION 的第一个 SELECT 中。
 
■ 只有在使用 UNION ALL 时,FOUND_ROWS() 的值才是精确的。如果使用不带 ALL UNION,则会发生重复删除,FOUND_ROWS() 的值只是近似的。
 
■ 如果 UNION 中没有 LIMIT,则忽略 SQL_CALC_FOUND_ROWS 并返回为处理 UNION 而创建的临时表中的行数。
 
除了这里描述的情况外,FOUND_ROWS() 的行为是未定义的(例如,它跟随一个 SELECT 语句后会报错失败)
 
 
 
 
官方文档:
https://dev.mysql.com/doc/refman/8.0/en/information-functions.html
文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论