巧用rand()提取随机行:


  mysql中rand()获取0-1之间的一个随机数.这个函数和order by能把数据随机排序。  

  随机从表中取出十条数据:


select * from tablename order by rand() limit 10;


此方法确实很方便,但是效率上却慢的惊人,切勿使用。


 SELECT * FROM `table`WHERE id>= ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) * RAND() + (SELECT MIN(id) FROM `table`) LIMIT 10


  这条语句看上去有点复杂,但实际的运行效率想到的高,而且能保证10条记录都是随机。测试了下,用时0.048s,相当给力。

利用GROUP BY的WITH ROLLUP

使用group by的with rollup子句可以检索出更多的分组聚合信息。  

mysql> select * from demo;
+-------+-------+
| cname | pname|
+-------+-------+
| bj    | hd   |
| bj    | hd   |
| bj    | xc   |
| bj    | xc   |
| bj    | hd   |
| sh    | dh   |
| sh    | dh   |
| sh    | rg   |
| sh    | dh   |
+-------+-------+
9 rows in set (0.00 sec)

对demo表按照cname、pname列分组对pname列进行聚合计算如下


mysql> select cname,pname,count(pname) from demo groupby cname,pname;

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

| cname | pname | count(pname) |

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

| bj   | hd    |            3 |

| bj   | xc    |            2 |

| sh   | dh    |            3 |

| sh   | rg    |            1 |

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

4 rows in set (0.00 sec)

同样使用with rollup关键字后,统计出更多的信息,如下。

注意: with rollup不可以和ordery by同时使用


mysql> select cname,pname,count(pname) from demo groupby cname,pname with rollup;

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

| cname | pname | count(pname) |

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

| bj   | hd    |            3 |

| bj   | xc    |            2 |

| bj   | NULL  |            5 |

| sh   | dh    |            3 |

| sh   | rg    |            1 |

| sh   | NULL  |            4 |

| NULL  | NULL  |           9 |

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

7 rows in set (0.00 sec)


mysql help使用:?  % \G

1.mysql使用时如果记不住命令可用?获得帮助。通常是 ? create  /   ? alter  这样使用

2.当太长的命令记不住可以 ? reg%获得了regexp的使用方法。? opti%获得了optimize的使用方法。

3.\G 会格式化输出sql结果。使用\G不用加;。