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

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

数据库杂货铺 2021-08-01
712
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论