| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 数据库开发

MySQL语言参考(3) :SELECT和WHERE子句的函数

时间:2005-12-09 08:02:09  来源:  作者:笑醉了
2榭凑陆?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 开始可以被使用。

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 通常列的字符串值比较 ENUMSET 列,而不是字符串在集合中相对应的位置。这将会被修正。
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;
or
mysql> 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: 0

mysql> 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) 精度执行。

示例(译者注):

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
    无相关信息
栏目更新
栏目热门