巧用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不用加;。