起因
最初是因为前天去面试的时候,虽然我想要面试的岗位是Android开发但是该公司要的是Java开发,硬着头皮还是去试了试,最后一张笔试试卷上考到了SQL,然而我太长时间没有用过SQL了,最近一次用应该是上学期应付JSP期末大作业的学生管理系统了,所以现在开始每天学习一点点SQL知识,与君共勉~
开始学习
最基础的select、from、where我不再赘述
今天要来学习的是limit、offset、order by
用到的数据库: 表名为 products
接下来贴出创建该表和插入数据的SQL语句 需要的同学自取
CREATE TABLE `products` (
`prod_id` char(10) NOT NULL,
`vend_id` char(10) NOT NULL,
`prod_name` char(255) NOT NULL,
`prod_price` decimal(8,2) NOT NULL,
`prod_desc` text,
PRIMARY KEY (`prod_id`),
KEY `FK_Products_Vendors` (`vend_id`),
CONSTRAINT `FK_Products_Vendors` FOREIGN KEY (`vend_id`) REFERENCES `vendors` (`vend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `products` VALUES ('BNBG01', 'DLL01', 'Fish bean bag toy', '3.49', 'Fish bean bag toy, complete with bean bag worms with which to feed it');
INSERT INTO `products` VALUES ('BNBG02', 'DLL01', 'Bird bean bag toy', '3.49', 'Bird bean bag toy, eggs are not included');
INSERT INTO `products` VALUES ('BNBG03', 'DLL01', 'Rabbit bean bag toy', '3.49', 'Rabbit bean bag toy, comes with bean bag carrots');
INSERT INTO `products` VALUES ('BR01', 'BRS01', '8 inch teddy bear', '5.99', '8 inch teddy bear, comes with cap and jacket');
INSERT INTO `products` VALUES ('BR02', 'BRS01', '12 inch teddy bear', '8.99', '12 inch teddy bear, comes with cap and jacket');
INSERT INTO `products` VALUES ('BR03', 'BRS01', '18 inch teddy bear', '11.99', '18 inch teddy bear, comes with cap and jacket');
INSERT INTO `products` VALUES ('RGAN01', 'DLL01', 'Raggedy Ann', '4.99', '18 inch Raggedy Ann doll');
INSERT INTO `products` VALUES ('RYL01', 'FNG01', 'King doll', '9.49', '12 inch king doll with royal garments and crown');
INSERT INTO `products` VALUES ('RYL02', 'FNG01', 'Queen doll', '9.49', '12 inch queen doll with royal garments and crown');
准备工作已经完成了,接下来进入正题!
limit 与offset
limit 会指示数据库返回不超过某个数值行数的数据
offset会指示数据库从哪一条记录开始返回
例如:
SELECT prod_name FROM products LIMIT 4
对照上面的最初的数据库的图片,大家可以看到 这条语句返回了products表最顶部的5条数据
接下来 我们来看limit 与 offset 一起使用会发生什么
SELECT prod_name FROM products LIMIT 4 OFFSET 2
返回的结果:
我们可以看到数据库返回的数据是从第3条数据开始,直到第6条数据为止
注意!offset 2 指的是从第三行开始 那么 offset 0 指的是从第一行开始啦 和数组差不多是一个意思
在Mysql中可以对LIMIT 4 OFFSET 2进行简写
可以写成 LIMIT 2,4 效果是一样的
order by
关于order by:指的是对查询到数据以数据的某个字段为标准比如(价格)进行排序
DESC 表示 降序
ASC 表示升序 同时ASC也是默认的 所以写不写都一样
对于order by 与 limit 的混用
《SQL必知必会》(第四版)中对于order by 有这样的描述
在指定一条order by 子句时,应该保证它是select语句中的最后一条子句。如果它不是最后的子句,将会出现错误消息
我们来看这样的一条SQL语句:
SELECT prod_name FROM products LIMIT 4 OFFSET 2 ORDER BY prod_name DESC
报错信息如下:
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘ORDER BY prod_name DESC’ at line 1
接下来我们调换order by 和limit的位置
SELECT prod_name FROM products ORDER BY prod_name DESC LIMIT 2,4
我们看看原本的数据库啊 这回是没有报错了 那么再来看看输出 我们是先对对products 表以prod_name 为标准进行了降序排序 然后输出了第三条到第六条数据
得出结论:要先排序然后再截取数据