
这里记录一个问题
在MySQL中,我们要查看前3条记录的话,是使用limit
简单的分页也可以使用力limit来完成
这都比较常见,如果我们想要获取数据的前10%呢?
在SQLServer中,我们可以直接使用top 10 percent 就可以了,但在MySQL中,我们得另想办法
前10%的数据,我们得知道数据一共有多少,那我们就知道该获取多少条记录了,然后还得知道记录的行号。
@row_num这个变量,是按行来的,所以我们再where条件中使用的时候,他是最后1条记录的行号,及总记录数
总记录数乘以50%,就是前50%的记录数,这样,我们就获取了前X%数据,做完收工。
方案一:
加个自增列,每次插入获取最后一行的行号(前提:插入数据不会被删除)
方案二:
使用触发器,每次插入后获取数据行数(并不推荐该方案,因为入口是确定的,不会有多个)
方案三:
插入后程序获取数据行数,计算行数是否满足更新条件
个人觉得这样的需求,应该不会有删除,不然之前变更也会没太大意义,因为被变更的数据也可能被删除,如果不会被删除,还是推荐方案一
另外,还可以插入时累计数据行数在程序中缓存起来,如果缓存没了,重新读一次,这样可以避免每次都查数据库,但是有个弊端,就是需要自己管理这个缓存
MySQL数据库limit分页示例
1selectfrompersonslimitA,B;
解释:
A,查询起点
B,需要的行数
2示例:
selectfrompersonslimit0,4;
解释:
起点位置为0,开始查询,返回4条数据。
selectfrompersonslimit4,4;
解释:
起点为4,开始查询,返回4天数据。
3特殊:
selectfrompersonslimit10;
意思是,起点为0,开始查询,返回10条记录。
与selectfrompersonslimit0,10;是等价的。
4按规则排序的同时,进行分页:
selectfrompersons
orderbylastname
limit0,10;
Usage: mysql [OPTIONS] [database] //命令方式
-, --help //显示帮助信息并退出
-I, --help //显示帮助信息并退出
--auto-rehash //自动补全功能,就像linux里面,按Tab键出提示差不多,下面有例子
-A, --no-auto-rehash //默认状态是没有自动补全功能的。-A就是不要自动补全功能
-B, --batch //ysql不使用历史文件,禁用交互
(Enables --silent)
--character-sets-dir=name //字体集的安装目录
--default-character-set=name //设置数据库的默认字符集
-C, --compress //在客户端和服务器端传递信息时使用压缩
-#, --debug[=#] //bug调用功能
-D, --database=name //使用哪个数据库
--delimiter=name //mysql默认命令结束符是分号,下面有例子
-e, --execute=name //执行mysql的sql语句
-E, --vertical //垂直打印查询输出
-f, --force //如果有错误跳过去,继续执行下面的
-G, --named-commands
/Enable named commands Named commands mean this program's
internal commands; see mysql> help When enabled, the
named commands can be used from any line of the query,
otherwise only from the first line, before an enter
Disable with --disable-named-commands This option is
disabled by default/
-g, --no-named-commands
/Named commands are disabled Use \ form only, or use
named commands only in the beginning of a line ending
with a semicolon (;) Since version 109 the client now
starts with this option ENABLED by default! Disable with
'-G' Long format commands still work from the first
line WARNING: option deprecated; use
--disable-named-commands instead/
-i, --ignore-spaces //忽视函数名后面的空格
--local-infile //启动/禁用 LOAD DATA LOCAL INFILE
-b, --no-beep //sql错误时,禁止嘟的一声
-h, --host=name //设置连接的服务器名或者Ip
-H, --html //以html的方式输出
-X, --xml //以xml的方式输出
--line-numbers //显示错误的行号
-L, --skip-line-numbers //忽略错误的行号
-n, --unbuffered //每执行一次sql后,刷新缓存
--column-names //查寻时显示列信息,默认是加上的
-N, --skip-column-names //不显示列信息
-O, --set-variable=name //设置变量用法是--set-variable=var_name=var_value
--sigint-ignore //忽视SIGINT符号(登录退出时Control-C的结果)
-o, --one-database //忽视除了为命令行中命名的默认数据库的语句。可以帮跳过日志中的其它数据库的更新。
--pager[=name] //使用分页器来显示查询输出,这个要在linux可以用more,less等。
--no-pager //不使用分页器来显示查询输出。
-p, --password[=name] //输入密码
-P, --port=# //设置端口
--prompt=name //设置mysql提示符
--protocol=name //使用什么协议
-q, --quick //不缓存查询的结果,顺序打印每一行。如果输出被挂起,服务器会慢下来,mysql不使用历史文件。
-r, --raw //写列的值而不转义转换。通常结合--batch选项使用。
--reconnect //如果与服务器之间的连接断开,自动尝试重新连接。禁止重新连接,使用--disable-reconnect。
-s, --silent //一行一行输出,中间有tab分隔
-S, --socket=name //连接服务器的sockey文件
--ssl //激活ssl连接,不激活--skip-ssl
--ssl-ca=name //CA证书
--ssl-capath=name //CA路径
--ssl-cert=name //X509 证书
--ssl-cipher=name //SSL cipher to use (implies --ssl)
--ssl-key=name //X509 密钥名
--ssl-verify-server-cert //连接时审核服务器的证书
-t, --table //以表格的形势输出
--tee=name //将输出拷贝添加到给定的文件中,禁时用--disable-tee
--no-tee //根--disable-tee功能一样
-u, --user=name //用户名
-U, --safe-updates //Only allow UPDATE and DELETE that uses keys
-U, --i-am-a-dummy //Synonym for option --safe-updates, -U
-v, --verbose //输出mysql执行的语句
-V, --version //版本信息
-w, --wait //服务器down后,等待到重起的时间
--connect_timeout=# //连接前要等待的时间
--max_allowed_packet=# //服务器接收/发送包的最大长度
--net_buffer_length=# //TCP / IP和套接字通信缓冲区大小。
--select_limit=# //使用--safe-updates时SELECT语句的自动限制
--max_join_size=# //使用--safe-updates时联接中的行的自动限制
--secure-auth //拒绝用(pre-411)的方式连接到数据库
--server-arg=name //Send embedded server this as a parameter
--show-warnings //显示警告
为每一行记录添加行号
方法一:
为了实现row_number函数功能,此方法我们要使用到会话变量,下面的实例是从
employees
表中选出5名员工,并为每一行添加行号:
1
2
3
4
5
6
set@row_number
=
0;
select
(@row_number:=@row_number
+
1)
asnum,
firstname,
lastname
from
employees
limit
5;
输出结果:
在这个实例中:
首先,定义变量
@row_number
,并初始化为0;
然后,在查询时我们为
@row_number
变量加1。
方法二:
这种方法仍然要用到变量,与上一种方法不同的是,我们把变量当做派生表,与主业务表关联查询实现row_number函数功能。下面我们仍然以查询5位员工为例:
1
2
3
4
5
select
(@row_number:=@row_number
+
1)
asnum,
firstname,
lastname
from
employees,(select@row_number:=0)
ast
limit
5;
这样的输出结果与上一种结果是一致的。
需要注意的是,在这种方法中,派生表必须要有别名,否则执行时会出错。
为每一组添加行号
了解oracle的朋友应该知道,row_number函数还有一个非常有用的功能就是分组排序
“over
partition
by”
。mysql同样可以实现这样的功能,看下面的实例:
首先将payments表中按照客户将记录分组:
1
2
3
4
5
select
customernumber,
paymentdate,
amount
from
payments
orderbycustomernumber;
输出结果如下:
下面我们需要将每个客户添加一个行号,这里我们需要用到两个变量,一个用于存储行号,一个用于存储客户编号,如:
1
2
3
4
5
6
7
8
9
10
11
select
@row_number
:=
case
when@customer_no
=
customernumber
then@row_number
+
1
else1
endasnum,
@customer_no
:=
customernumber
asc
以上就是关于MySQL-获取前10%数据全部的内容,包括:MySQL-获取前10%数据、mysql 插入数据 时 更新表数据、MySQL怎样使用limit获取全部数据(mysql中的limit)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)